Foros del Web » Programación para mayores de 30 ;) » Java »

comunicacion TCP con ssl

Estas en el tema de comunicacion TCP con ssl en el foro de Java en Foros del Web. hola! estoy probando una comunicacion segura SSL, pero me da error en las claves al intentar inciar el servidor: Código: import java.net.*; import java.io.*; import ...
  #1 (permalink)  
Antiguo 22/06/2011, 04:03
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
comunicacion TCP con ssl

hola! estoy probando una comunicacion segura SSL, pero me da error en las claves al intentar inciar el servidor:

Código:
import java.net.*;
import java.io.*;
import javax.net.ServerSocketFactory;
import java.net.ServerSocket;
import javax.net.ServerSocketFactory;
import javax.net.ssl.SSLServerSocketFactory;

public class serverSSL {

	public static void main( String args[] ) {
			
		ServerSocket server = (ServerSocket)null;
		try {
      
		    ServerSocketFactory ssocketFactory = SSLServerSocketFactory.getDefault();
		    server = ssocketFactory.createServerSocket(4321);
		    while(true){
        		Socket client = server.accept();
            	InputStream aux = client.getInputStream();
            	DataInputStream flujo = new DataInputStream( aux );

            	System.out.println(flujo.readUTF());
            	
            	OutputStream bufferSalida = client.getOutputStream();  
            	DataOutputStream datos = new DataOutputStream(bufferSalida);  
            	
            	datos.writeUTF("hola");
		    }
        
		} catch(IOException e) {
        	e.printStackTrace();
        } 
		
     }
	
}

Para ejecutarlo hago:

Código:

ubuntu@ubuntu:~/pruebasJava$ keytool -genkey -keystore mySrvKeystore -keyalg RSA
Enter keystore password:
Re-enter new password:
What is your first and last name?
  [Unknown]:
What is the name of your organizational unit?
  [Unknown]:
What is the name of your organization?
  [Unknown]:
What is the name of your City or Locality?
  [Unknown]:
What is the name of your State or Province?
  [Unknown]:
What is the two-letter country code for this unit?
  [Unknown]:
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
  [no]:  y

Enter key password for <mykey>
        (RETURN if same as keystore password):

ubuntu@ubuntu:~/pruebasJava$ java -Djavax.net.ssl.trustStore=mySrvKeystore -Djavax.net.ssl.trustStorePassword=123456 serverSSL
javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled.
        at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.checkEnabledSuites(SSLServerSocketImpl.java:310)
        at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.accept(SSLServerSocketImpl.java:255)
        at serverSSL.main(serverSSL.java:18)
¿Qué estoy haciendo mal? soy incapaz de verlo!

gracias!
  #2 (permalink)  
Antiguo 22/06/2011, 04:30
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: comunicacion TCP con ssl

Es que no tienes un certificado o el que tienes no es correcto.
  #3 (permalink)  
Antiguo 22/06/2011, 04:45
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
Respuesta: comunicacion TCP con ssl

Efectivamente, la instrucción correcta para generar el certificado es:

Código:
ubuntu@ubuntu:~/pruebasJava$ keytool -certreq -keyalg RSA -alias mySrvKeystore -file /home/ubuntu/pruebasJava/certificado.txt -keystore mySrvKeystore
Ahora el servidor arranca, asi que he copiado mySrvKeystore al archivo donde tengo clienteSSL.class y ejecuto:

Código:
java -Djavax.net.ssl.trustStore=mySrvKeystore -Djavax.net.ssl.trustStorePassword=123456 clienteSSL

pero me da error en el negociado de las claves:

Código:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source)
	at java.io.DataOutputStream.write(Unknown Source)
	at java.io.DataOutputStream.writeUTF(Unknown Source)
	at java.io.DataOutputStream.writeUTF(Unknown Source)
	at clientSSL.main(clientSSL.java:29)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
	at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
	at sun.security.validator.Validator.validate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
	... 12 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
	at java.security.cert.CertPathBuilder.build(Unknown Source)
	... 18 more
  #4 (permalink)  
Antiguo 22/06/2011, 06:09
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: comunicacion TCP con ssl

Te dice que no tienes un certificado válido. A lo mejor es que necesita estar firmado o necesitas un certificado de una CA concreta.

También puede ser que no te esté encontrando el certificado que tienes.

Normalmente los certificados se contienen en un contenedor (suele ser un JKS aunque hay más tipos) y es este el que se usa, no el certificado directamente. Tu error también puede venir por ahí.
  #5 (permalink)  
Antiguo 22/06/2011, 07:38
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
Respuesta: comunicacion TCP con ssl

Gracias! lo que he hecho ha sido generar el almacén de claves, y una solicitud, con el comando:

Código:
keytool -certreq -keyalg RSA -alias prueba -file claves.txt -keystore mySrvKeystore
Entonces he copiado el almacén de claves en mi cliente.

Si listo mis claves recibo:

Código:

ubuntu@ubuntu:~/pruebasJava$ keytool -list -keystore mySrvKeystore
Enter keystore password:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 2 entries

mysrvkeystore, Jun 22, 2011, PrivateKeyEntry,
Certificate fingerprint (MD5): 6F:AF:E1:19:B8:F2:7F:CF:5D:50:E6:97:F7:30:A9:1F
mykey, Jun 22, 2011, PrivateKeyEntry,
Certificate fingerprint (MD5): 00:01:33:F8:61:8F:89:60:7C:B2:59:33:18:2A:41:A5
¿Me falta algún paso?

Respecto a lo de firmar el certificado, ¿cómo puedo hacerlo?


Gracias!
  #6 (permalink)  
Antiguo 22/06/2011, 07:54
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
Respuesta: comunicacion TCP con ssl

Bueno... pues he encontrado el error aunque si comparo no se que hacía mal antes... la instrucción correcta para llamar al cliente es:

Código:
java -Djavax.net.ssl.trustStore=mySrvKeystore -Djavax.net.ssl.trustStorePassword=123456 clienteSSL

Etiquetas: comunicacion, ssl, tcp
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:21.