11

我正在通过 HTTPS 连接到 Web 服务。我已经完成了我认为使它工作所需的一切,但最后我握手失败。

我发现作为一个新用户,由于“垃圾邮件保护”,我不能发布超过 2 个链接 - 非常感谢 stackoverflow ......无论如何,这是一个 pastebin 帖子的链接,其中包含所有链接......所以当我在这里写“link#1”,这是对这些链接的引用:http: //pastebin.com/y4zGNRC7

  • 我使用 HttpClient(服务 URL 上的 GET)验证了相同的行为,并通过 CXF 代理实际调用了 Web 服务
  • 我正在设置密钥库和信任库 - 我尝试了“代码中”方式(link#1)和设置系统属性 - 即 System.setProperty("javax.net.ssl.keyStore", "mykeystore.jks" );
  • SSL 调试已开启 ( javax.net.debug=all )
  • SSL 调试会脱口而出 keystore 和 truststore 的内容(即看起来像 java“知道它们”)-link#2
  • 似乎有一些客户端-服务器通信正在进行,但由于某种原因它崩溃了链接#3
  • 我在浏览器(Chrome)和使用 openssl s_client 中使用客户端和 CA 证书成功连接到服务器
  • wireshark 显示来自 java (link#4) 的客户端-服务器对话较少,例如来自 Chrome (link#5)

另一个奇怪的事情是,当我设置密钥库和不设置密钥库时,我似乎得到了相同的行为(唯一的区别是当我执行密钥库时,内容会打印在控制台中,仅此而已)。

我试着用谷歌搜索这个问题,我在 stackoverflow 上看到了很多类似的帖子,但没有任何帮助。我尝试更改协议版本(“TLSv1”、“SSLv3”,甚至是奇怪的 v2 Hello)。任何帮助将不胜感激 - 也许我可能忽略了一些基本的事情......我在这里变得绝望......谢谢

PS 我在 Fedora Core 15 (64bit) 上运行 java 1.6 update 30

4

3 回答 3

5

问题是即使设置了密钥库和信任库,java 还是决定不将客户端证书发送到服务器。原因是服务器请求了一个由 RootCA 机构签署的证书,但客户端证书是由 SubCA 机构(由 RootCA 颁发)签署的。

最初,密钥库仅包含客户端证书,信任库包含 SubCA 证书。然后我也尝试将 SubCA 证书添加到密钥库中,但 java 只是忽略了它。

所以这解决了 hanshake 失败之谜,但不是我的问题。

我为此创建了一个单独的问题...叹息 :-( 为什么 java 在 SSL 握手期间不发送客户端证书?

于 2012-02-15T18:35:37.727 回答
4

我认为不包含 CA 的信任库是最有可能的问题。您可以使用 Javakeytool将站点的证书导入到cacerts文件中,执行以下操作:

keytool -keystore pathtocacerts -import -trustcacerts -v -alias aliasName -file root.crt

默认的 cacerts 密钥库密码是changeit. 该cacerts文件通常在jre/lib/security目录下。

于 2012-02-12T20:48:56.207 回答
2

您没有提供足够的信息,但我猜您的客户端信任库配置不正确。信任库包含用于签署其他证书的受信任证书,并且必须包括服务器和客户端证书链的根证书。客户端密钥库包含客户端 SSL 证书和私钥。

于 2012-02-12T19:56:11.880 回答