2012-09-25 28 views
6

Estoy en el proceso de aprendizaje de SSL y en este proceso estoy intentando crear una conexión SSL entre un servidor .NET con un cliente Java. Yo uso un certificado autofirmado para este propósito. No quiero usar el almacén de claves estándar en Java, así que creo un almacén de claves personalizado y lo cargo en su lugar.Error al realizar la conexión SSL del cliente Java al servidor .NET

Utilizo los siguientes pasos para generar el certificado y el archivo pfx para usar en el extremo del servidor .NET.

  1. Generado un cerficiate utilizando el siguiente comando en Windows.

    makecert -r -pe -SR "localhost" - $ -n individual "CN = localhost" -SV .pvk -r localhost.cer

  2. de conversión a un .pfx tan que puedo cargar este certificado en la aplicación de servidor .NET.

  3. Exportación del archivo .cer como .pem (formato Base64).

  4. Tomó el archivo .cer (el componente público del certificado mencionado anteriormente) y creó un archivo .jks (JavaKeyStore) para usar como el cliente de Java con el siguiente comando.

    keytool \ -import \ -v \ -trustcacerts \ -alias 0 \ -file < (openssl x509 -in localhost.pem) \ -keystore mystore.jks \ -storetype JKS \ -storepass ez24get

  5. incorporado este .jks en la aplicación cliente Java e inició la conexión con el siguiente código

    FileInputStream fis = new FileInputStream("res/myjksstore.jks"); 
    KeyStore trusted = KeyStore.getInstance("JKS"); 
    trusted.load(fis, "ez24get".toCharArray());   
    
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustManagerFactory.init(trusted); 
    
    SSLContext context = SSLContext.getInstance("SSL"); 
    context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); 
    
    Socket socket = context.getSocketFactory().createSocket("localhost", 443); 
    
    String str = "abc123"; 
    
    socket.getOutputStream().write(GeneralUtil.toByta(str.length())); 
    socket.getOutputStream().write(str.getBytes()); 
    
    socket.setKeepAlive(true); 
    

Pero cuando trato de escribir datos en el zócalo, me sale el siguiente error al final del servidor

System.ComponentModel.Win32Exception: El cliente y el servidor no puede comunicarse , porque no poseen un algoritmo común

El código de mi servidor es el siguiente ...

X509Certificate cert = new X509Certificate ("localhost.pfx", "abc123");

TcpListener listener = new TcpListener (IPAddress.Loopback, 443); listener.Start();

while (true) {

try {TcpClient tcpClient = oyente.AcceptTcpClient();

NetworkStream networkStream = tcpClient.GetStream(); 

    SslStream sslStream = new SslStream(networkStream); 

    sslStream.AuthenticateAsServer(cert, false, SslProtocols.Default, 

false);

byte[] data1 = new byte[4]; 

    sslStream.Read(data1, 0, data1.Length); 

    int len = BitConverter.ToInt32(data1, 0); 

    String message = "Length of incoming data " + 

BitConverter.ToInt32 (data1, 0);

byte[] data2 = new byte[len]; 

    sslStream.Read(data2, 0, data2.Length); 

    message += " Message: " + ASCIIEncoding.ASCII.GetString(data2); 

    Thread.Sleep(1000);  

} catch (Exception ex)
{
} }

La excepción se produce en la línea de

sslStream.AuthenticateAsServer (cert, falso, SslProtocols.Default , falso);

¿Cuál podría ser el motivo y cómo puedo solucionarlo?

Cualquier ayuda sería muy apreciada.

+3

intenta conectarse a su servidor con openssl y comprobar conjuntos de cifrado disponible. 'openssl s_client -connect localhost: 443 -CAfile ' Publicar por favor la salida de este comando. – user1516873

+0

¿Se conectó exitosamente utilizando el almacén de claves estándar con alguna variante de este código, o es esta su primera toma en la conexión SSL? – TheBlastOne

+0

No, no perseguí mucho más porque tuve que soltar SSL Streams por motivos relacionados con el rendimiento. Acabo de implementar un handshake de RSA para compartir una clave de sesión y luego usé el cifrado AES para manejar el transporte. Similar a lo que hace SSL. –

Respuesta

-1

SSLEngine (obtenido de SSLContext) se debe establecer en modo cliente (setUseClientMode)

+0

Ese es el valor predeterminado, y no está utilizando el 'SSLEngine' en absoluto. -1 – EJP

Cuestiones relacionadas