Mi objetivo es establecer una comunicación segura entre un servidor Java y el cliente escrito en C#.Comunicación SSL entre aplicaciones Java y C#
código del servidorjava:
System.setProperty("javax.net.ssl.keyStore","cert/mySrvKeystore");
System.setProperty("javax.net.ssl.keyStorePassword","myPassword");
SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket = = (SSLServerSocket) sslserversocketfactory.createServerSocket(2389);
while(true) {
System.err.println("server w8 new connection");
try {
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
//sslsocket.startHandshake();
in = sslsocket.getInputStream();
out = sslsocket.getOutputStream();
out.flush();
String response = new String(receiveMessage());
while (response != "end") {
System.out.println("Server recv="+response);
response = new String(receiveMessage());
sendMessage(("echo="+response).getBytes());
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
y el cliente escrito en C#:
client = new TcpClient() { SendTimeout = 5000, ReceiveTimeout = 5000 };
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(host), port);
client.Connect(serverEndPoint);
client.NoDelay = true;
Console.WriteLine("Client connected.");
// Create an SSL stream that will close the client's stream.
SslStream sslStream = new SslStream(client.GetStream(), false, ValidateServerCertificate, null);
// The server name must match the name on the server certificate.
try
{
sslStream.AuthenticateAsClient("someName");
}
catch (AuthenticationException error)
{
Console.WriteLine("Exception: {0}", error.Message);
if (error.InnerException != null)
{
Console.WriteLine("Inner exception: {0}", error.InnerException.Message);
}
Console.WriteLine("Authentication failed - closing the connection.");
client.Close();
return;
}
ASCIIEncoding ascii = new ASCIIEncoding();
SendData(ascii.GetBytes("Hello World"));
y
public static bool ValidateServerCertificate(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
// Do not allow this client to communicate with unauthenticated servers.
return false;
}
y consigo los siguientes errores: en C#
A first chance exception of type "System.Security.Authentication.AuthenticationException" occurred in System.dll
Certificate error: RemoteCertificateChainErrors
Exception: The remote certificate is invalid according to the validation procedure.
Authentication failed - closing the connection.
Sé que el problema puede ser el hecho de que utilizo diferentes tipos de certificados, pero no sé cómo hacer un sslServerSocket estándar con X509Certificate en java. ¿Puede alguien ayudarme, con un buen ejemplo o algún consejo, cómo puedo alcanzar mi objetivo?
P.S. Buscaba en la biblioteca de bouncycastle, hace que tenga implementaciones java y C#, pero me gustaría utilizar bibliotecas estándar y la funcionalidad integrada de los idiomas.
Ah, [memorias] (http://stackoverflow.com/questions/719556/c-sharp-client-connecting-to-a-java-server-over-ssl). (Una de mis primeras preguntas sobre SO) –
Esto es parecido a otra pregunta en StackOverflow, sin embargo no puedo publicar comentarios Pregunta: [x509 Creando un certificado sin BouncyCastle] (http://stackoverflow.com/questions/1615871/creating-an-x509-certificate-in-java-without-bouncycastle) Y aquí hay un enlace que se encuentra en la página que describe cómo hacerlo: [Creación de un certificado x509 en Java] (http://bfo.com/ blog/2011/03/08/odds_and_ends_creating_a_new_x_509_certificate.html) – ry8806
gracias, esto realmente me ayudó a generar el Certificado X509, pero ¿cómo puedo ahora empaquetar esto en SSLServerSocket en Java? – savionok