我使用openssl生成一个认证密钥。这是我的命令:
openssl genrsa -des3 -out enc_key.pem 1024
我导出到cer文件,然后使用java keytool导入java密钥库(jks)。
密钥库听起来不错。我可以从我的java应用程序加载密钥库。
问题是当客户端连接到服务器时(在这种情况下是FTP服务器,而不是Web服务器,我使用apache mina),发生了异常:
javax.net.ssl.SSLHandshakeException:SSL握手失败。 在org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:433) 在org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) 在org.apache.mina.core.filterchain.DefaultIoFilterChain.access $ 5(DefaultIoFilterChain.java:429)
...
引起:javax.net.ssl.SSLHandshakeException:没有共同的密码套件 在com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(未知来源) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source) 在javax.net.ssl.SSLEngine.wrap(未知来源)
...
引起:javax.net.ssl.SSLHandshakeException:没有共同的密码套件 at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)
我想问一些事情:
任何帮助将不胜感激!感谢
答案 0 :(得分:48)
为什么使用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
现在在启用SSL的服务器中使用server.jks
,其中包含证书和私钥。