当前位置: 首页 > 知识库问答 >
问题:

Java 11如何验证一个中间证书在cacerts中不可用的证书?

田鹤轩
2023-03-14

我不必去修复一些不起作用的东西,但我试着去理解为什么有些东西会起作用,因为我认为它不应该起作用。

我使用的是OpenJDK11/Ubuntu 16.04。我打了个HTTPS电话。SSL握手成功。

证书链包含3个证书:

  • 当然是API证书。由中间CA发行(issuer=CN=DigiCert TLS RSA SHA256 2020 CA1,O=DigiCert Inc,C=US)
  • 中级CA证书。由根CA发行(issuer=CN=DigiCert全球根CA,OU=www.DigiCert.com,O=DigiCert Inc,C=US)
  • 根证书

第二个证书在使用中的cacert密钥存储库(lib/Security文件夹下的默认密钥存储库)中不可用。这听起来很正常,因为证书是在2021年4月发布的,而JRE是在2021年1月发布的(openjdk版本“11.0.10”2021-01-19)

为什么这次握手能成功?在我看来,由于Java不知道第二个证书,它无法验证API证书。

共有1个答案

花飞尘
2023-03-14

为了在ssl handhshake阶段验证服务器证书,http客户端需要用于签署服务器证书(中间证书)的证书,以及用于签署中间证书(根证书)的证书。

所有这些证书构成了所谓的“认证链”。通常有一个中间证书,有时没有中间证书(服务器证书直接由根证书签名),或者你可以有许多中间证书。

JCE/JSE需要所有这些证书来验证服务器身份。如果缺少一个证书(一般是根证书),或者被修改,或者无效,或者在某些情况下由于网络故障或服务器设置不良,java会抛出一个SSLHandshakeExctive。

Java在其受信任的存储中查找根证书(根据JRE设置:存在默认值,可以通过不同的方式覆盖它们)。服务器证书由服务器发送。

我认为中间证书也必须存在于java trusted store中。这是个错误。实际上,中间证书也是由服务器发送的。

当中间证书不在java信任存储中时,我没有SSLHandhakeException,所以我不明白。在这里讲过之后,我写了几行java来读取服务器发送的内容,现在我明白了中间证书是由服务器发送的。

因此,您不需要在java信任存储中拥有中间证书,ssl handhsake就可以成功。

 类似资料:
  • 问题内容: 我正在尝试连接到HTTPS URL,但是我需要使用客户端身份验证以及第三方软件在我的系统上放置的证书。 我丝毫不知道如何找到或使用它,我所要做的只是C#示例代码,这与我为此找到的所有Java答案都大不相同。(例如,KeyStore显然需要某种密码吗?) 这是我拥有的C#示例代码 然后,它仅遍历WS2_store_Certs CertificateCollection并一路检查它们。再进

  • 问题内容: 简介: 有没有一种方法可以强制PHP中的内置SoapClient-class通过HTTPS连接到具有无效证书的服务器? 我为什么要这样做? 我已经在没有DNS条目或证书的服务器上部署了新应用程序。我想 在 设置DNS条目和修复证书 之前 尝试使用SoapClient连接到它,而最合理的方法似乎是使客户端在测试过程中忽略证书。 我是否没有意识到这是巨大的安全风险? 这仅用于测试。服务投入

  • 假设我编写了两个Java应用程序:和,它们在两个独立的服务器上部署和运行(部署到和部署到

  • 问题内容: 在Java中需要有关加密例程的帮助。 给定PKCS#7签名,我想针对受信任的存储验证它包含的所有证书。我假设签名中包含的所有证书均以正确的顺序形成有效的证书路径(或链,无论如何),因此 最上面的(#0)是签名证书; 下一个(#1)是中间证书,用于签署#0; 下一个(#2)是另一个中间证书,用于签署#1; 等等。 最后一个证书(#N)由CA签名。 到目前为止,这是我设法破解的: 所以问题

  • inter证书有什么用? 我有这个证书链: root-VeriSign Class 3 Public Primary Certification Authority-g5.cer Inter-Symantec Class 3 EV SSL CA-G3.CER website.pfx

  • 当我尝试安装扩展时,出现以下错误: 我已经知道问题是我们的内部网络结构,它用我们自己的SSL证书包装每个SSL证书,而不是每个应用程序都信任我们的证书。 是否可以在Visual Studio代码中设置属性Trust all SSL证书? 谢啦