web-dev-qa-db-fra.com

Un magasin de clés Java key store) peut-il importer une paire de clés générée par OpenSSL?

Je génère une clé de certification avec openssl. Voici ma commande:

openssl genrsa -des3 -out enc_key.pem 1024

J'exporte dans un fichier cer, puis avec Java keytool que j'importe dans Java keystore (jks).

Le keystore sonne bien. Je peux charger le keystore à partir de mon Java app.

Le problème est lorsque le client se connecte au serveur (dans ce cas, il s'agit d'un serveur FTP, pas d'un serveur Web, et j'utilise Apache mina), l'exception s'est produite:

javax.net.ssl.SSLHandshakeException: la négociation SSL a échoué. à org.Apache.mina.filter.ssl.SslFilter.messageReceived (SslFilter.Java:433) à org.Apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived (DefaultIoFilterChain.Java:434) à org.Aorepache. .filterchain.DefaultIoFilterChain.access $ 5 (DefaultIoFilterChain.Java:429)

...

Provoqué par: javax.net.ssl.SSLHandshakeException: aucune suite de chiffrement en commun sur com.Sun.net.ssl.internal.ssl.Handshaker.checkThrown (source inconnue) sur com.Sun.net.ssl.internal.ssl.SSLEngineImpl .checkTaskThrown (source inconnue) sur com.Sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord (source inconnue) sur com.Sun.net.ssl.internal.ssl.SSLEngineImpl.wrap (source inconnue) sur javax.net .ssl.SSLEngine.wrap (source inconnue)

...

Provoqué par: javax.net.ssl.SSLHandshakeException: aucune suite de chiffrement en commun sur com.Sun.net.ssl.internal.ssl.Alerts.getSSLException (source inconnue) sur com.Sun.net.ssl.internal.ssl.SSLEngineImpl .fatal (source inconnue)

Il y a quelques choses que je veux demander:

  1. Quel est le chiffre de certification que je génère avec openssl? Comment pouvons-nous savoir? peut-être par la ligne de commande openssl xxx?
  2. Je vais à http://Java.Sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA . Et j'ai mis SSL_RSA_xxx aux suites de chiffrement activées, mais je ne peux toujours pas fonctionner (j'ai mis SSL_RSA parce que le SSL utilise ssl implisit, et genrsa, à mon avis, genrsa génère RSA). Est-ce correct?
  3. Quelqu'un connaît la solution?
  4. Ou, n'importe qui sait comment générer le keystore standard à partir de la ligne de commande openssl jusqu'à ce qu'il puisse être utilisé dans Java app (bien sûr avec le chiffrement). Parce que pour le moment, je peux générer la certification depuis openssl et exporter keystore Java, mais je ne sais pas quel est le chiffrement que j'ai utilisé et comment j'utilise dans l'application Java app. Remarque: je peux exécuter si le keystore est généré directement depuis Java. En ce moment le problème est si le keystore généré par Java keytool de certification comme openssl (et autre peut-être).

Toute aide serait appréciée! Merci

22
Jef

Pourquoi utilisez-vous OpenSSL pour générer la paire de clés? Pourquoi ne pas simplement utiliser keytool?

L'outil genrsa génère simplement une clé privée. Comment créez-vous un certificat correspondant? Comment importez-vous la clé privée dans votre magasin de clés Java keystore? (Je demande, car keytool ne peut importer une clé privée qu'à partir d'un magasin de clés existant, et uniquement à partir de Java 6 et plus.)

Je soupçonne que votre problème est que votre magasin de clés ne contient pas d'entrée de clé (clé privée et certificat correspondant). Lorsque vous listez le contenu du keystore avec keytool, combien d'entrées y a-t-il? S'agit-il d'entrées clés ou d'entrées fiables?


Le serveur a besoin d'accéder à la clé privée pour s'authentifier. Pour importer une clé privée, utilisez Java 6 amélioré keytool.

Après avoir créé la clé et le certificat avec OpenSSL, utilisez OpenSSL pour créer un magasin de clés PKCS # 12:

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

Puis convertissez ce magasin en un magasin de clés Java key store:

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

Maintenant, utilisez server.jks sur votre serveur SSL, qui contient le certificat et la clé privée.

49
erickson