Есть сервер и клиент на Java. Хочу переделать клиент на C#. Связь через сокет и SSL.
Сервер Java, насколько я могу видеть, не использует сертификат,а каким-то образом работает на прямую.
Все, что видел, связанного с C# использует X.509 сертификат...
В растерянности — как подружить их между собой.
Сервер (Java)
SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket serverSocket = (SSLServerSocket) ssf.createServerSocket(this.serverPort);
String[] suites = serverSocket.getSupportedCipherSuites();
serverSocket.setEnabledCipherSuites(suites);
SSLSocket clientSocket = null;
clientSocket = (SSLSocket) serverSocket.accept();
clientSocket.startHandshake();
InputStream sin = clientSocket.getInputStream();
OutputStream sout = clientSocket.getOutputStream();
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);
...
Клиент (Java)
InetAddress e = InetAddress.getByName(this.socketip);
SSLSocketFactory sf = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket(e, socketport);
String[] suites = socket.getSupportedCipherSuites();
socket.setEnabledCipherSuites(suites);
socket.startHandshake();
socket.setSoTimeout(10000);
InputStream sin = socket.getInputStream();
OutputStream sout = socket.getOutputStream();
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);
...
На попытку просто подключится примерно так (C#)
string ip = ...
int port = ...
TcpClient sslClient = new TcpClient(ip, port);
SslStream sslStream = new SslStream(sslClient.GetStream());
sslStream.AuthenticateAsClient(ip);
Получаю ошибку:
System.Security.Authentication.AuthenticationException: Ошибка вызова SSPI, см. внутреннее исключение.
---> System.ComponentModel.Win32Exception: Получено непредвиденное сообщение или оно имеет неправильный формат
--- Конец трассировки внутреннего стека исключений ---
в System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
в System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
в System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation)
в System.Net.Security.SslStream.AuthenticateAsClient(String targetHost)
в SSLConnect.Program.Main(String[] args) в C:\Users\SC\Documents\Visual Studio 2012\Projects\SSLConnect\SSLConnect\Program.cs:строка 20 (там где AuthenticateAsClient)