Может ли хранилище ключей Java импортировать пару ключей, созданную OpenSSL? - PullRequest
21 голосов
/ 21 апреля 2010

Я генерирую ключ сертификации с помощью openssl.Вот моя команда:

openssl genrsa -des3 -out enc_key.pem 1024

Я экспортирую в файл cer, затем с помощью java keytool импортирую в хранилище ключей java (jks).

Склад ключей звучит хорошо.Я могу загрузить хранилище ключей из моего приложения Java.

Проблема заключается в том, что клиент подключается к серверу (в данном случае это FTP-сервер, а не веб-сервер, и я использую apache mina), возникла исключительная ситуация:

javax.net.ssl.SSLHandshakeException: сбой рукопожатия SSL.в org.apache.mina.filter.ssl.SslFilter.messageReceived (SslFilter.java:433) в org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived (DefaultIoFilterChaore.a..a..filterchain.DefaultIoFilterChain.access $ 5 (DefaultIoFilterChain.java:429)

...

Причина: javax.net.ssl.SSLHandshakeException: нет наборов шифров вРаспространенный на com.sun.net.ssl.internal.ssl.Handshaker.checkThrown (неизвестный источник) на com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown (неизвестный источник) на com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord (неизвестный источник) по адресу com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap (неизвестный источник) по адресу javax.net.ssl.SSLEngine.wrap (неизвестный источник)

...

Вызвано: javax.net.ssl.SSLHandshakeException: нет общих наборов шифров на com.sun.net.ssl.internal.ssl.Alerts.getSSLException (неизвестноИсточник) на com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal (Неизвестный источник)

Есть несколько вопросов, которые я хочу спросить:

  1. Какой шифр сертификации я генерирую с openssl?Как мы можем знать?может быть, из командной строки openssl xxx?
  2. Я перехожу к http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA. И я помещаю SSL_RSA_xxx во включенные комплекты шифров, но все равно не могу работать (я поставил SSL_RSA, потому что это SSL использует ssl implisit,и genrsa, просто мое мнение genrsa генерировать RSA).Это правильно?
  3. Кто-нибудь знает решение?
  4. Или кто-нибудь знает, как сгенерировать стандартное хранилище ключей из командной строки openssl, пока его нельзя будет использовать в java-приложении (конечно, с шифром).Потому что сейчас я могу сгенерировать сертификацию из openssl и экспортировать java-хранилище ключей, но я не знаю, какой шифр я использовал и как я использую его в java-приложении.Примечание: я могу работать, если хранилище ключей генерируется непосредственно из Java.Прямо сейчас проблема заключается в том, что хранилище ключей, сгенерированное Java Keytool из сертификации, как openssl (и, возможно, другие).

Любая помощь будет оценена!Спасибо

1 Ответ

48 голосов
/ 21 апреля 2010

Почему вы используете OpenSSL для генерации пары ключей? Почему бы просто не использовать keytool?

Инструмент genrsa просто генерирует закрытый ключ. Как вы создаете соответствующий сертификат? Как вы импортируете закрытый ключ в хранилище ключей Java? (Я спрашиваю, потому что keytool может импортировать только закрытый ключ из существующего хранилища ключей и только из Java 6 и более поздних версий.)

Я подозреваю, что ваша проблема в том, что в вашем хранилище ключей нет записи ключа (закрытый ключ и соответствующий сертификат). Когда вы перечислите содержимое хранилища ключей с помощью keytool, сколько там записей? Это ключевые записи или доверенные записи?


Серверу необходим доступ к закрытому ключу для аутентификации. Чтобы импортировать закрытый ключ, используйте Java 6 расширенный keytool.

После создания ключа и сертификата в OpenSSL используйте OpenSSL для создания хранилища ключей PKCS # 12:

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

Затем преобразуйте это хранилище в хранилище ключей Java:

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

Теперь используйте server.jks на вашем сервере с поддержкой SSL, который содержит сертификат и закрытый ключ.

...