Genero una clave de certificación con openssl. Aquí es mi comando:¿Puede un almacén de claves de Java importar un par de claves generado por OpenSSL?
openssl genrsa -des3 -out enc_key.pem 1024
puedo exportar en un archivo CER, a continuación, con herramienta de claves Java importo en almacén de claves de Java (JKS).
El almacén de claves suena bien. Puedo cargar el almacén de claves de mi aplicación java.
El problema es cuando el cliente conectarse al servidor (en este caso es el servidor FTP, no servidor web, y lo uso Mina Apache), a excepción ocurrió:
javax.net.ssl.SSLHandshakeException: SSL handshake failed. at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:433) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$5(DefaultIoFilterChain.java:429)
...
Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source) at javax.net.ssl.SSLEngine.wrap(Unknown Source)
...
Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)
Hay algunas cosas que quiero preguntar:
- ¿Cuál es el cifrado de certificación que genero con openssl? ¿Cómo podemos saber? tal vez por la línea de comando openssl xxx?
- Voy a http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA. Y puse SSL_RSA_xxx en los conjuntos de cifrado habilitados, pero todavía no puedo trabajar (puse SSL_RSA porque el SSL está usando ssl implisit, y genrsa, solo mi opinión genrsa es generar RSA). ¿Es correcto?
- ¿Alguien sabe la solución?
- O, cualquiera sabe cómo generar el almacén de claves estándar desde la línea de comando openssl hasta que se pueda usar en la aplicación java (fuera del curso con el cifrado). Porque ahora mismo puedo generar la certificación de openssl y exportar keystore java, pero no sé cuál es el cifrado que utilicé y cómo lo uso en la aplicación java. Nota: Puedo ejecutar si el almacén de claves es generado directamente desde Java. En este momento el problema es si el almacén de claves generado por java keytool de certificación como openssl (y otros tal vez).
¡Cualquier ayuda será apreciada! Gracias
Básicamente, puedo ejecutar la aplicación (ver mi pregunta punto 4) con el almacén de claves generado por java keytool (sí, como dijiste, es correcto, ya lo hice). Funciona bien si genero directamente keystore (jks) desde java keytool, entonces mi aplicación (servidor FTPS) solo usa ese keystore. Ningún problema con eso. Su pregunta de por qué uso OpenSSL para generar el par de claves es porque actualmente el cliente tiene certificación de licencia (verisign), así que primero tengo que probar con openssl. Por cierto, keytool puede importar desde cert x509 (haciendo el comando: openssl req -x509 -key key.pem -in req.pem -out cert.pem -days 365) – Jef
Continuar desde arriba He importado la clave que generó openssl a java keystore (jks) y la aplicación java dice que el keystore ya es válido (pruebo con la otra clave, java puede verificar su keystore válido o no). El problema es que cuando ejecuto la aplicación a través del almacén de claves (generado por java keytool import from openssl cert), la aplicación arroja la excepción anterior. El almacén de claves contiene una entrada de clave (funciona en httpd ssl), cuando hago la lista de herramientas clave, la entrada ya es de confianza. Hago este comando: keytool -import -v -trustcacerts -alias server-alias -file cert.pem -keystore cacerts.jks -keypass x -storepass x – Jef
@Jef - * No, * no es correcto, o su programa trabajaría; El hecho de que su tienda de claves esté en un formato * válido * no significa que * contenga * la información necesaria para autenticar el servidor. En particular, su afirmación, "cuando hago una lista de herramientas clave, la entrada ya es de confianza", hace que suene como si fuera una entrada de confianza, no una entrada clave. ** Una entrada de confianza no funcionará; no hay una clave privada. ** Aplique un razonamiento simple: ¿alguna vez le dio a 'keytool' un archivo que contiene la clave privada? ¿Cómo espera realizar la autenticación del servidor sin tener disponible la clave privada? – erickson