2010-04-21 21 views
20

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:

  1. ¿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?
  2. 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?
  3. ¿Alguien sabe la solución?
  4. 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

Respuesta

45

¿Por qué está utilizando OpenSSL para generar el par de llaves? ¿Por qué no usar keytool?

La herramienta genrsa acaba de generar una clave privada. ¿Cómo está creando un certificado correspondiente? ¿Cómo está importando la clave privada en su almacén de claves Java? (Lo pregunto, porque keytool solo puede importar una clave privada desde un almacén de claves existente, y solo desde Java 6 en adelante.)

Sospecho que su problema es que su almacén de claves no contiene una entrada clave (clave privada y certificado correspondiente). Cuando enumera los contenidos del almacén de claves con keytool, ¿cuántas entradas hay? ¿Son entradas clave o entradas de confianza?


El servidor necesita acceder a la clave privada para autenticarse. Para importar una clave privada, use Java 6's mejorado keytool.

Después de crear la clave y el certificado con OpenSSL, usar OpenSSL para crear un archivo PKCS # 12 del almacén de claves:

openssl pkcs12 -export -in cert.pem -inkey key.pem > server.p12 

luego convertir esta tienda en un almacén de claves de Java:

keytool -importkeystore -srckeystore server.p12 -destkeystore server.jks -srcstoretype pkcs12 

Ahora use server.jks en su servidor habilitado SSL, que contiene el certificado y la clave privada.

+0

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

+0

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

+0

@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

Cuestiones relacionadas