为什么我的 QuoVadis 证书在 Java 应用程序中无效?

Why is my QuoVadis certificate not valid in a Java app?

我有 QuoVadis 签署的服务器证书。如果我使用浏览器访问我的服务器,一切都很好,但是如果我从 Java 应用程序或通过 NodeJS 脚本尝试,我会收到一个问题,我的证书路径无法验证?

这是什么原因?我的想法是,一些证书颁发机构,如 QuoVadis 或其他根 CA 包含在 Java 等中,不是吗?

... certification authorities like QuoVadis or others root CA are included in Java etc, isn't it?

对于Java,它会有所不同。 Oracle(以前的 Sun)构建 Java 默认情况下使用它们自己的一组根 CA,在作为 [=36= 的一部分安装的文件 JRE/lib/security/cacerts 中],但可以修改此文件,并且 Java 进程 (JVM) 或程序可以覆盖默认值。 OpenJDK 各不相同;一些构建类似地默认为 cacerts,而一些默认为它们使用的平台提供的证书存储,例如 Linux 或 MacOS。你没有说你使用什么 Java and/or 平台。

'etc' 变化更大。 NodeJS 使用 OpenSSL,它同样有一个默认值,可以依赖于构建 and/or 平台。你没有提供细节或任何线索其他东西(?)是什么。

但是,更有可能这根本不是根证书。所有 public CA,包括 QuoVadis,都会颁发终端实体或 'leaf' 证书,这些证书需要使用至少一种中间体或 'chain cert' 进行验证,有时甚至不止一种。 (所有)TLS 标准要求服务器发送此链证书(或这些证书)作为握手的一部分,并且我见过的每个 CA 都提供了有关使用哪个链证书的说明,例如在这种情况下 https://support.quovadisglobal.com/kb/a469/understanding-the-trust-link-downloads-page.aspx 。然而,由于许多服务器是由从未阅读或遵循说明的人操作的,因此即使服务器违反规则,大多数主要浏览器都有允许他们构建和验证证书链的变通办法。 Java 和 NodeJS/OpenSSL 客户端(以及其他客户端)不会这样做,因此如果服务器未能发送正确的链,它们将无法通过验证。

如果这是一个 public HTTPS 服务器,https://www.ssllabs.com/ssltest 会告诉你,除了(很多)其他关于 TLS 实现和配置的信息,服务器是否正在发送或丢失链证书。对于其他服务器,还有其他工具,但我知道的那些需要用户的一些思考或知识。