Java HttpsURLCподключение и отправка клиентских сертификатов - PullRequest
1 голос
/ 12 ноября 2010

Я пытаюсь отправить сертификат клиента на сервер. Я создаю SSLSocketFactory по соединению HttpURLC.

Я думаю, мне нужно сделать ключ доступным через KeyManager, о котором знает SSLSocketFactory. Проблема в том, что я получаю ключ в KeyManager.

Закрытый ключ и сертификат находятся в файле PEM (и они не могут быть в файле хранилища ключей). Я знаю, как читать / декодировать файл, и я успешно проверил сертификат клиента. Но когда я пытаюсь вставить ключ (как байт []) в KeyManager, он жалуется: 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});

Как правильно это сделать?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

Хитрость для этой работы заключалась в преобразовании файла PEM в другой формат.Пока я делал это внешне с помощью 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

Затем я смог успешно добавить ключ и сертификат в хранилище ключей в памяти:

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 голос
/ 18 марта 2014

Я получил то же исключение для чтения закрытого ключа из зашифрованного файла RSA. Я исправил проблему, вместо того чтобы создавать запись в хранилище ключей в двоичном формате:

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

Я просто создаю его как ключевой объект:

keyStore.setKeyEntry(IdentityManagement.ALIAS, privateKey, password.toCharArray(), new X509Certificate[]{(X509Certificate)cert});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...