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

Я генерирую ключ сертификации с помощью 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. И я помещаю SSL_RSA_xxx во включенные комплекты шифров, но все равно не могу работать (я ставлю SSL_RSA, потому что это SSL использует ssl implisit, и genrsa, просто мое мнение, что genrsa генерирует RSA). Это правильно?
  3. Кто-нибудь знает решение?
  4. Или кто-нибудь знает, как сгенерировать стандартное хранилище ключей из командной строки openssl, пока его не можно будет использовать в java-приложении (естественно, с шифром). Потому что сейчас я могу сгенерировать сертификацию из openssl и экспортировать java-хранилище ключей, но я не знаю, какой шифр я использовал и как я использую его в java-приложении. Примечание: я могу работать, если хранилище ключей генерируется непосредственно из Java. Прямо сейчас проблема заключается в том, что хранилище ключей генерируется Java Keytool из сертификации, как OpenSSL (и, возможно, другие).

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

1 ответ

Решение

Почему вы используете 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, который содержит сертификат и закрытый ключ.

Другие вопросы по тегам