2010-04-21 19 views
20

Genero una chiave di certificazione con openssl. Qui è il mio comando:Un archivio chiavi Java può importare una coppia di chiavi generata da OpenSSL?

openssl genrsa -des3 -out enc_key.pem 1024

esportare in file di cer, poi con java keytool ho importare in java keystore (JKS).

Il keystore suona bene. Posso caricare il keystore dalla mia app java.

Il problema è quando il client si connette al server (in questo caso è il server FTP, non server web, e io uso apache mina), l'eccezione si è verificato:

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)

C'è un paio di cose che voglio chiedere:

  1. Qual è il codice di certificazione che viene generato con openssl? Come possiamo sapere? forse tramite la riga di comando openssl xxx?
  2. Vado a http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA. E ho messo SSL_RSA_xxx per le suite di crittografia abilitate, ma non posso ancora lavorare (ho messo SSL_RSA perché SSL sta usando ssl implisit, e genrsa, solo la mia opinione genrsa è generare RSA). È corretto?
  3. Qualcuno conosce la soluzione?
  4. Oppure, qualcuno sa come generare il keystore standard dalla riga di comando di openssl fino a quando non può essere utilizzato nell'app java (fuori rotta con il codice). Perché in questo momento posso generare la certificazione da openssl ed esportare keystore java, ma non so quale sia il codice che ho usato e come uso nell'app java. Nota: posso eseguire se il keystore viene generato direttamente da java. In questo momento il problema è se il keystore generato da java keytool dalla certificazione come openssl (e altro forse).

Qualsiasi aiuto sarà apprezzato! Grazie

risposta

45

Perché stai utilizzando OpenSSL per generare la coppia di chiavi? Perché non usare solo keytool?

Lo strumento genrsa genera solo una chiave privata. Come stai creando un certificato corrispondente? Come stai importando la chiave privata nel tuo keystore Java? (Chiedo, perché l'keytool può importare solo una chiave privata da un keystore esistente e solo da Java 6 in poi.)

Ho il sospetto che il tuo problema è che il tuo keystore non contiene una chiave (chiave privata e certificato corrispondente). Quando si elencano i contenuti del keystore con keytool, quante voci ci sono? Sono voci chiave o voci attendibili?


Il server deve accedere alla chiave privata per autenticarsi. Per importare una chiave privata, utilizzare Java 6 avanzato keytool.

Dopo aver creato la chiave e il certificato con OpenSSL, usare OpenSSL per creare un file PKCS # 12 chiavi:

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

Poi convertire questo negozio in un Java chiavi:

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

Ora utilizzare server.jks nel server di abilitazione SSL, che contiene il certificato e la chiave privata.

+0

Fondamentalmente, posso eseguire l'app (vedere la mia domanda punto 4) con il keystore generato da java keytool (sì, come hai detto tu, è corretto, l'ho già fatto). Funziona bene se generi direttamente keystore (jks) da java keytool, quindi la mia app (server FTPS) usa semplicemente il keystore. Nessun problema. La tua domanda perché utilizzo OpenSSL per generare la coppia di chiavi è perché attualmente il client ha la certificazione di licenza (verisign) quindi devo prima testare con openssl. Btw, keytool può importare da cert x509 (facendo il comando: openssl req -x509 -key key.pem -in req.pem -out cert.pem -days 365) – Jef

+0

Continua da sopra Ho importato la chiave generata da openssl a java keystore (jks) e l'app java ha detto che il keystore è già valido (provo l'altra chiave, java può verificare il suo keystore valido o meno). Il problema è quando eseguo l'app tramite il keystore (generato dall'importazione di keytool java dal cert di openssl), l'app genera l'eccezione sopra. Il keystore contiene una voce di chiave (funziona in httpd ssl), quando faccio elenco keytool, la voce è già attendibile. Faccio questo comando: keytool -import -v -trustcacerts -alias server-alias -file cert.pem -keystore cacerts.jks -keypass x -storepass x – Jef

+0

@Jef - * No, * non è corretto, o il tuo programma funzionerebbe; solo perché il tuo keystore è in un formato * valido * non significa che * contenga * le informazioni necessarie per autenticare il server. In particolare, la tua affermazione "quando faccio un elenco di keytool, la voce è già attendibile", fa sembrare che sia una voce di fiducia, non una voce di chiave. ** Una voce di fiducia non funzionerà, non c'è una chiave privata. ** Applica alcuni semplici ragionamenti: non dai mai a "keytool" un file contenente la chiave privata? Come prevedete di eseguire l'autenticazione del server senza rendere disponibile la chiave privata? – erickson

Problemi correlati