首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VeriSign中的Java SSLHandshakeException签名证书

VeriSign中的Java SSLHandshakeException签名证书
EN

Stack Overflow用户
提问于 2014-05-27 20:20:52
回答 2查看 667关注 0票数 1

在Java桌面应用程序中,我需要连接到一个SSL。当我尝试它时,我得到了一个异常:

PKIX :PKIX路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:找不到指向所请求目标的有效证书路径

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

我的问题是:如果证书是用VeriSign签名的,为什么java不能识别它呢?默认情况下,cacerts密钥库中不安装VeriSign证书?也许我不理解SSL是如何工作的。浏览器和java桌面行为有什么不同?我可以使用浏览器连接到此URL,而无需安装任何内容。

谢谢

EN

回答 2

Stack Overflow用户

发布于 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

票数 0
EN

Stack Overflow用户

发布于 2014-05-27 20:40:33

您没有说明将哪个证书导入到密钥库中。通常在验证过程中涉及到几个证书:

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

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

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

但是,如果您使用新的系统(或简单地使用firefox的新浏览器配置文件)并首先访问配置错误的站点,那么它也会像Java应用程序一样在那里抱怨。如果您只需将相关的中间证书导入密钥库并信任它,那么它也可以工作,因为它不需要链的其余部分来获取受信任证书的路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23889304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档