2010-11-11 27 views
1

J'essaie d'envoyer un certificat client au serveur. Je construis un SSLSocketFactory sur un HttpURLConnection.java HttpsURLConnection et envoi de certificats client

Je pense que je dois rendre la clé disponible via un KeyManager dont SSLSocketFactory a connaissance. Le problème que j'ai est d'obtenir la clé dans le KeyManager.

La clé privée et le certificat sont dans un fichier PEM (et ils ne peuvent pas figurer dans un fichier de magasin de clés). Je sais lire/décoder le fichier et j'ai validé avec succès le certificat client. Mais lorsque je tente de mettre la clé (comme octet []) dans le KeyManager, il se plaint: java.security.KeyStoreException: key is not encoded as EncryptedPrivateKeyInfo

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
KeyStore ks = KeyStore.getInstance("JKS"); 
ks.load(null); // init the keystore 

// This Fails: it wants it encoded as EncryptedPrivateKeyInfo 
ks.setKeyEntry("MyAlias", clientKeyAsBytes, new Certificate[]{clientCert}); 

Quelle est la bonne façon de le faire?

+0

Juste pour que je comprends mieux la racine votre problème, dans quel contexte faites-vous cela? Il existe un certain nombre de bibliothèques et de frameworks qui peuvent gérer ce genre de choses automatiquement pour vous. Une telle bibliothèque est la bibliothèque JSch (J Secure Channel). –

+0

Ceci est le code pour les clients qui ne veulent pas utiliser de bibliothèques supplémentaires (qui devraient être vérifiées). Le client appelle un service Web qui requiert un certificat client pour l'autorisation. Et le déploiement utilise des fichiers .PEM. –

Répondre

2

L'astuce pour effectuer ce travail était de convertir le fichier PEM dans un format différent. Je l'ai fait à l'extérieur pour l'instant avec OpenSSL

openssl pkcs8 -topk8 -nocrypt -in key.pem -inform PEM -out client-key.der -outform DER 
openssl x509 -in cert.pem -inform PEM -out client-cert.der -outform DER 

Ensuite, j'ai été avec succès en mesure d'ajouter la clé et le certificat à l'en mémoire keystore:

PKCS8EncodedKeySpec keysp = new PKCS8EncodedKeySpec(clientKeyAsBytes); 
PrivateKey ff = kf.generatePrivate(keysp); 

// This works with DER format of key bytes 
ks.setKeyEntry("MyAlias", clientKeyAsBytes, new Certificate[]{clientCert}); 
1

Je suis la même exception pour la lecture du privé clé d'un fichier crypté RSA. Je fixe la question en lieu de créer l'entrée dans le fichier de clés dans son format binaire:

keyStore.setKeyEntry(IdentityManagement.ALIAS, privateKey.getEncoded(), new X509Certificate[]{(X509Certificate)cert}); 

je créer simplement comme un objet clé à la place:

keyStore.setKeyEntry(IdentityManagement.ALIAS, privateKey, password.toCharArray(), new X509Certificate[]{(X509Certificate)cert});