在Java桌面应用程序中,我需要连接到一个SSL。当我尝试它时,我得到了一个异常:
PKIX :PKIX路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:找不到指向所请求目标的有效证书路径
为了解决这个问题,我用浏览器找到这个地址,下载.cert文件中的证书,然后使用keytool命令导入到我的java cacerts密钥库中。之后,应用程序就可以正常工作了。
我的问题是:如果证书是用VeriSign签名的,为什么java不能识别它呢?默认情况下,cacerts密钥库中不安装VeriSign证书?也许我不理解SSL是如何工作的。浏览器和java桌面行为有什么不同?我可以使用浏览器连接到此URL,而无需安装任何内容。
谢谢
发布于 2014-05-27 20:34:05
当我们访问使用SSL提供身份和加密的安全站点时,它提供的证书由可信的第三方站点验证,如verisign、godaddy或thwate。
通过使用证书,浏览器或java客户端知道它们正在与正确的站点(它声称是谁)对话,而不是在重定向的代理站点上。如果你使用浏览器访问网站,这一步是非常透明的,因为如果证书不在浏览器的可信存储上,它会要求你添加该证书,然后它会被添加。
但是当你使用Java程序访问一个安全的站点时,这个证书握手的步骤对用户来说是不透明的,并且证书是通过JRE的trustStore来验证的。
阅读更多:http://javarevisited.blogspot.com/2012/03/add-list-certficates-java-keystore.html#ixzz32v1wL3Gl
发布于 2014-05-27 20:40:33
您没有说明将哪个证书导入到密钥库中。通常在验证过程中涉及到几个证书:
如果缺少任何中间证书,验证将失败。因此,服务器不仅要发送叶证书,还要发送所有中间证书。这就是许多网站失败的地方,例如它们不提供完整的证书链。
但是为什么这在浏览器中可以工作呢?因为有足够多的站点无法提供中间证书,并且浏览器希望提供最佳体验,所以它们将缓存中间证书。因此,如果您转到一个由verisign签名的站点,该站点提供了可信链,然后转到另一个站点,该站点使用相同的证书签名,但该站点不提供链,则它仍然可以工作,因为链证书是从另一端缓存的。
但是,如果您使用新的系统(或简单地使用firefox的新浏览器配置文件)并首先访问配置错误的站点,那么它也会像Java应用程序一样在那里抱怨。如果您只需将相关的中间证书导入密钥库并信任它,那么它也可以工作,因为它不需要链的其余部分来获取受信任证书的路径。
https://stackoverflow.com/questions/23889304
复制相似问题