Может ли хранилище ключей 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(Неизвестный источник)
Есть несколько вещей, которые я хочу спросить:
- Какой шифр сертификации я создаю с помощью openssl? Как мы можем знать? может быть из командной строки openssl xxx?
- Я захожу на 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). Это правильно?
- Кто-нибудь знает решение?
- Или кто-нибудь знает, как сгенерировать стандартное хранилище ключей из командной строки 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, который содержит сертификат и закрытый ключ.