2010-11-11 3 views
1

Я пытаюсь отправить сертификат Клиента на сервер. Я строю SSLSocketFactory на HttpURLConnection.java HttpsURLConnection и отправка клиентских сертификатов

Я думаю, что мне нужно сделать ключ доступным через 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}); 

Что правильный способ сделать это?

+0

Просто так, что я лучше понять корень ваша проблема, в каком контексте вы это делаете? Существует множество библиотек и фреймворков, которые могут автоматически обрабатывать такие вещи для вас. Одной из таких библиотек является библиотека JSch (J Secure Channel). –

+0

Это код для клиентов, которые не хотят использовать какие-либо дополнительные библиотеки (которые должны быть проверены). Клиент вызывает веб-службу, для которой требуется авторизация клиента. И развертывание использует файлы .PEM. –

ответ

2

Уловкой для этой работы было преобразование файла 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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^