繁体   English   中英

VeriSign签名证书中的Java SSLHandshakeException

[英]Java SSLHandshakeException in VeriSign signed certificate

在Java桌面应用程序中,我需要连接到SSL URL。 尝试时,出现异常:

SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效证书路径

为了解决这个问题,我用浏览器转到该地址,将证书下载到.cert文件中,然后使用keytool命令导入到我的java cacerts密钥库中。 之后,该应用程序运行正常。

我的问题是:如果用VeriSign签名,为什么Java无法识别证书? 默认情况下,cacerts密钥库中未安装VeriSign证书吗? 也许我不明白SSL是如何工作的。 浏览器和Java桌面行为之间有什么区别? 我可以使用浏览器连接到该URL,而无需进行任何安装。

谢谢

当我们访问使用SSL提供身份和加密的安全站点时,它会提供由受信任的第三方站点(如verisign,godaddy或thwate)验证的证书。

通过使用证书,浏览器或Java客户端知道他们正在与正确的站点(据称是该站点)交谈,而不是在重定向的代理站点上交谈。 如果您使用浏览器访问网站,则此步骤非常透明,因为如果证书不在浏览器的受信任存储区中,它将要求您添加该证书,然后将其添加。

但是,当您使用Java程序访问安全站点时,证书握手的这一步骤对用户而言并不透明,并且证书已通过JRE的trustStore进行了验证。

了解更多: http : //javarevisited.blogspot.com/2012/03/add-list-certficates-java-keystore.html#ixzz32v1wL3Gl

您没有说要导入密钥库的证书。 通常,验证涉及多个证书:

  • 受信任的根证书,该证书存储在密钥库或浏览器中(Java不与浏览器共享密钥库)
  • 标识站点的叶子证书
  • 多数情况下还提供中间证书,这些证书提供了从叶证书到受信任根的签名方式,从而建立了受信任路径

如果缺少任何中间证书,则验证失败。 因此,服务器不仅必须发送叶证书,还必须发送所有中间证书。 这就是许多站点失败的地方,例如,它们不提供完整的证书链。

但是,为什么这在浏览器中有效呢? 由于足够多的站点无法提供中间证书,并且由于浏览器希望提供最佳体验,因此它们将缓存中间证书。 因此,如果您转到由提供了受信任链的verisign签名的一个站点,然后再转到使用相同证书但未提供该链的站点签名,则该站点仍将起作用,因为链证书是从另一边。

但是,如果您使用的是全新系统(或者只是使用Firefox的新浏览器配置文件)并首先访问配置错误的网站,那么该网站也会像Java应用程序一样抱怨该网站。 而且,如果您只是将相关的中间证书导入密钥库中并因此信任它,那么它也将起作用,因为它不需要链的其余部分即可获取通往受信任证书的路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM