我通过HTTPS连接到Web服务。我已经完成了我认为需要的所有工作,但最终我得到了握手失败。
我发现作为一个新用户,我不能发布超过2个链接,因为“垃圾邮件保护” - 比很多堆栈溢出...无论如何这里是一个链接到一个所有链接拼写的pastebin帖子.. 。当我在这里写“链接#1”时,它是对这些链接的引用:http://pastebin.com/y4zGNRC7
另一个奇怪的事情是,当我设置密钥库时我似乎得到了相同的行为,而当我没有设置密钥库时(唯一的区别是当我在控制台中打印密钥库内容时,但是就是这样。)
我试过谷歌搜索问题,我在stackoverflow上看到了很多类似的帖子,但没有任何帮助。 我尝试更改协议版本(“TLSv1”,“SSLv3”,甚至是奇怪的v2 Hello)。 任何帮助将不胜感激 - 也许我可能忽略了一些基本的东西...我在这里绝望... 感谢名单
PS我在Fedora Core 15(64位)上运行java 1.6 update 30
答案 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密钥库密码为changeit
。 cacerts
文件通常位于jre/lib/security
目录下。