为什么我会出现握手失败(Java SSL)

时间:2012-02-12 13:31:11

标签: java exception ssl cxf handshake

我通过HTTPS连接到Web服务。我已经完成了我认为需要的所有工作,但最终我得到了握手失败。

我发现作为一个新用户,我不能发布超过2个链接,因为“垃圾邮件保护” - 比很多堆栈溢出...无论如何这里是一个链接到一个所有链接拼写的pastebin帖子.. 。当我在这里写“链接#1”时,它是对这些链接的引用:http://pastebin.com/y4zGNRC7

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

另一个奇怪的事情是,当我设置密钥库时我似乎得到了相同的行为,而当我没有设置密钥库时(唯一的区别是当我在控制台中打印密钥库内容时,但是就是这样。)

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

我为此创建了一个单独的问题......叹息:-( why doesn't java send the client certificate during SSL handshake?

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

默认的cacerts密钥库密码为changeitcacerts文件通常位于jre/lib/security目录下。