【发布时间】:2011-02-10 17:55:19
【问题描述】:
我使用 openssl 生成一个认证密钥。这是我的命令:
openssl genrsa -des3 -out enc_key.pem 1024
我导出到 cer 文件,然后使用 java keytool 导入到 java keystore (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(未知来源) 在 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(Unknown Source)
...
原因: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#AppA。我将 SSL_RSA_xxx 放入启用的密码套件,但仍然无法工作(我放入 SSL_RSA 是因为 SSL 使用的是 ssl implisit 和 genrsa,只是我认为 genrsa 是生成 RSA)。对吗?
- 有人知道解决办法吗?
- 或者,任何人都知道如何从 openssl 命令行生成标准密钥库,直到可以在 java 应用程序中使用(当然,使用密码)。因为现在我可以从 openssl 生成证书并导出 keystore java,但我不知道我使用的密码是什么以及如何在 java 应用程序中使用。注意:如果密钥库是直接从 java 生成的,我可以运行。现在的问题是,java keytool 生成的密钥库是否来自 openssl 等认证(可能还有其他)。
任何帮助将不胜感激!谢谢
【问题讨论】: