23

我用 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(Unknown Source) 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) at javax.net .ssl.SSLEngine.wrap(未知来源)

...

引起:javax.net.ssl.SSLHandshakeException:com.sun.net.ssl.internal.ssl.SSLEngineImpl 的 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) 没有共同的密码套件.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 生成证书并导出 keystore java,但我不知道我使用的密码是什么以及如何在 java 应用程序中使用。注意:如果密钥库是直接从 java 生成的,我可以运行。现在的问题是,java keytool 生成的密钥库是否来自 openssl 等认证(以及其他可能)。

任何帮助将不胜感激!谢谢

4

1 回答 1

49

为什么要使用 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 的服务器中使用,其中包含证书私钥。

于 2010-04-21T19:23:22.333 回答