我为什么会遇到握手故障(Java SSL)

问题描述:

我通过HTTPS连接到Web服务。我已经完成了所有我认为需要的工作,但最终我得到了握手失败。我为什么会遇到握手故障(Java SSL)

我发现作为一个新用户,由于“垃圾邮件保护”,我不能发布超过2个链接 - thanx很多* ...无论如何,这里是一个链接到一个pastebin帖子,所有链接拼写出来。 ..所以当我写“链接#1”这是这些链接的引用:http://pastebin.com/y4zGNRC7

  • 我使用的HttpClient(上取得成功的服务URL)和实际调用通过CXF代理Web服务验证了相同的行为我设置了密钥库和信任库 - 我尝试了“在代码中”的方式(链接#1)和设置系统属性 - 即System.setProperty(“javax.net.ssl.keyStore”,“mykeystore .jks“);
  • SSL调试是(javax.net.debug =全部)
  • SSL调试脱口而出两个密钥库和信任的内容(即看起来像Java“知道他们”) - 链接#2
  • 好像有一些客户端 - 服务器通信回事,但随后崩溃出于某种原因链接3
  • 我在浏览器(Chrome)使用客户端和CA证书都使用的OpenSSL的s_client.First
  • Wireshark的表演成功地连接到服务器来自java的更少的客户端 - 服务器对话(链接#4)然后例如来自Chrome(链接#5)

另一个奇怪的现象是,当我设置密钥库并且不知道时(我唯一的区别是当我在控制台中打印密钥库内容时,我似乎获得了相同的行为,但就是这样)。

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

PS我在Fedora Core 15运行Java 1.6更新30(64位)

+1

您可以发布一个异常堆栈跟踪? – home 2012-02-12 13:33:30

+0

*“我发现,作为一个新的用户我不能发布超过2个链接由于“垃圾邮件防护” - 比很多堆栈溢出“*。如果你使用这个网站很多,你会意识到SO的垃圾邮件防护措施是一件好事。 – 2012-02-12 13:43:31

+1

关于链接的主题,它被认为是不好的形式发布pastebin链接和类似的内容,因为它们很快就会蒸发,使得这个问题对未来的读者来说是无法理解的。 – 2012-02-12 13:50:49

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

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

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

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

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

+0

感谢您的回复Greg。请告诉我更多我应该提供的信息。我试图尽可能彻底,但我知道我可能错过了一些东西。 正如我写的,我设置了_truststore_和_keystore_。我确实在日志中放入了X,而不是实际的证书名称和内容,因为我不想在网上发布这些内容。密钥库包含客户端证书和私钥。信任库包含颁发证书的CA证书和根CA证书。 栈跟踪在这里似乎没有太大的帮助(我发布在上面的评论中)。 – 2012-02-13 08:26:44

+0

似乎客户**密钥库**被加载,但客户端证书没有被呈现给服务器,这就是握手失败的原因。日志显示一个空的客户端证书链。我不知道为什么:-( – 2012-02-14 10:52:56

我认为不包含CA的信任存储库是最可能发生的问题。您可以使用Java keytool导入证书的网站为cacerts文件做这样的事情:

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

默认的cacerts密钥存储密码是changeitcacerts文件通常在jre/lib/security目录下。

+0

我很确定信任库确实包含CA.当没有工作时,我还将根CA证书导入到truststore中......但这似乎没有帮助。 – 2012-02-13 09:57:53

+1

请注意,使用SSL调试时,truststore和keystore的内容会打印在控制台中。此外,客户端证书和CA证书(不是根目录)足以使其在浏览器中正常工作。 – 2012-02-13 10:00:05

+0

我尝试检查用keytool和一切商店的内容似乎都没问题我甚至尝试在启动时通过命令行选项设置这两个商店(即'-Djavax.net.ssl.keyStore =')无济于事...... – 2012-02-13 10:04:00