当前位置: 首页 > 面试题库 >

Java中的证书路径发现

田翰林
2023-03-14
问题内容

我尝试通过Java内置功能为此(HttpURLConnection)建立一个https连接。但是我得到这个异常:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
...
...

我的证书链是:

Root certificate -> Intermediate certificate -> Web server certificate

所使用的证书通过“路径发现”的含义是正确的。信任锚是根证书,该根证书导入到我系统上的Java密钥库中。中间证书不是…但是

  1. 中间证书由我信任的根签名-因此,我也信任中间证书。
  2. Web服务器证书已使用我信任的中间证书签名(第1点)

那么验证必须成功通过?我做错什么了吗?

我在某处读到了这个:

浏览器可以执行自动发现,而服务器到服务器则不能。

但是缺少此功能是非常基本的。是否有进行自动发现的明确方法?

  • * 更新

是的,这就是问题,GPI。我很困惑,因为浏览器可以验证服务器证书,但是Java应用程序不能。该行为的原因是:

  • 服务器仅发送最终证书,而不发送整个证书链;
  • 该证书是最近购买的,并使用相对较新的中间证书进行了签名;
  • 浏览器具有相对最新的证书列表,包括中间证书;
  • Java具有相对最新的证书列表,并且中间没有证书。
  • 浏览器通过中间证书验证最终证书Java无法检查证书链,因为:1.链未发送;2.最终证书的签署者(中间证书)不是信任锚。

解决方案可以是:

  • 服务器返回整个证书链
  • 要在Java信任库中添加的中间证书

问题答案:

我相信您已经检查了您的链,因此我们可以认为 RootCert 签署了 IntermediateCertIntermediateCert
签署了 ServerCert ,并带有有效的X500名称链和所有…

就是说,您的逻辑是有效的,只要信任 RootCert 就足够了,但不要忘记,为了构建路径,您的客户端必须在其姿势中拥有路径中的 所有 证书。

在您的情况下,如果您仅信任根证书,则服务器将播发其余证书链(中间证书和最终证书),由服务器决定。如果没有人“向”
HTTP客户端“提供”中间证书,则该客户端将失败,因为从 服务器 不知道无法进行 中间 操作。

通过使用该-Djavax.net.debug=all选项启动客户端,您实际上可以查看服务器证书链是什么。如果链的长度为1,则您的服务器仅发布最终证书,客户端无法猜测中间证书的存在。

(也可以使用浏览器进行检查,并要求查看服务器证书,但是您应注意,浏览器将向您显示到达信任锚的整个路径,因此,如果要推断服务器链是什么,则必须从此路径中删除浏览器的锚点)。

在生产服务上,您应该访问证书提供者的网站以了解什么被视为根证书(它可能不是最高级别的证书)。此有效根应该是您的客户端的信任锚,并且任何服务器都应从路径中的最后一个(其公用名是服务器的DNS名称)中至少通告链中的所有其他证书。



 类似资料:
  • 问题内容: 我有一个Web应用程序,要求客户端发送其证书,并且服务器必须验证证书(即查看颁发者是否为有效的颁发者,并存在于服务器的信任库中)。这是代码: 但是我有一个例外: 注意: 此处,客户端发送的证书为client.crt,用于签署client.crt证书的证书为密钥库“ trustedca”中的ca.crt。那为什么给这个例外呢? 问题答案: 如果您希望获得客户证书,请让JSSE为您完成所有

  • 伙计们!我正在尝试使用bouncycastle创建X.509证书,它应该由另一个证书签名并存储它的PEM base 64格式。 我已经有了自签名证书(公钥和私钥)。现在我要创建一个新的,并用现有的自签名证书签名。 验证无例外地通过了,这意味着从我的观点来看,它是由Cacert成功签署的: 然后将其解码到PEM base 64:

  • 我有一个通过SSL从node.js提供服务的网站。当我使用web浏览器(桌面和Android)访问站点时。一切都很好--当我检查证书是有效的并且一切看起来都很好时,锁出现了,表明站点是安全的。这应该意味着服务器设置正确,对吧? 然而,当我尝试使用Android WebView对完全相同的站点时,页面无法加载--我甚至在日志中看不到对该网页的请求。安德烈,在放松logcat上的过滤器后,我注意到了这

  • 我最近检测到不稳定的SSL证书路径验证 Ubuntu 12.04 LTS(GNU/Linux 3.2.0-26-generic x86_64) OpenJDK运行时环境(IceDea6 1.11.4)(6b24-1.11.4-1ubuntu0.12.04.1) OpenJDK 64位服务器VM(构建20.0-b12,混合模式) 和 Ubuntu 10.04.1 LTS OpenJDK运行时环境(I

  • 我是maven的新手,在添加依赖项(sl4j)时遇到了麻烦。我得到的这个项目显然是从Ant转换成maven的。顺便说一句,干净的安装是不起作用的。下面是pom.xml: 它在干净安装时会给出以下消息:

  • 我刚刚为我们的域名购买了一个新的通配符ssl证书,因为我们的旧证书即将到期。我已经将它安装在我们的cas服务器和应用服务器上,但是我在我们的应用服务器上得到以下堆栈跟踪: 两个服务器上的证书是相同的。