我有 QuoVadis 签署的服务器证书。如果我使用浏览器访问我的服务器,一切都很好,但是如果我从 Java 应用程序或通过 NodeJS 脚本尝试它,我会收到无法验证我的证书路径的问题?
是什么原因?我的想法是,像 QuoVadis 或其他根 CA 等一些证书颁发机构都包含在 Java 等中,不是吗?
我有 QuoVadis 签署的服务器证书。如果我使用浏览器访问我的服务器,一切都很好,但是如果我从 Java 应用程序或通过 NodeJS 脚本尝试它,我会收到无法验证我的证书路径的问题?
是什么原因?我的想法是,像 QuoVadis 或其他根 CA 等一些证书颁发机构都包含在 Java 等中,不是吗?
...像 QuoVadis 或其他根 CA 等认证机构都包含在 Java 等中,不是吗?
对于 Java,它会有所不同。默认情况下, Oracle(以前的 Sun)构建的 Java 在作为 Java 的一部分安装的文件中使用自己的一组根 CA,JRE/lib/security/cacerts
但可以修改此文件,并且 Java 进程 (JVM) 或程序可以覆盖默认值。OpenJDK各不相同;一些构建同样默认为 cacerts,而一些默认为他们使用的平台提供的证书存储,例如 Linux 或 MacOS。您没有说您使用什么 Java 和/或平台。
对于“等”,它的变化更大。NodeJS 使用 OpenSSL,它同样具有依赖于构建和/或平台的默认值。你没有提供细节或任何线索其他的东西(?)是什么。
但是,更有可能这根本不是根证书。所有公共 CA,包括 QuoVadis,颁发最终实体或“叶”证书,需要使用至少一个中间证书或“链证书”进行验证,有时甚至不止一个。(全部)TLS 标准要求服务器发送这个链证书(或这些证书)作为握手的一部分,我见过的每个 CA 都给出了使用哪个链证书的说明,例如在这种情况下https:// support.quovadisglobal.com/kb/a469/understanding-the-trust-link-downloads-page.aspx. 但是,由于许多服务器是由从不阅读或遵循说明的人操作的,因此大多数主流浏览器都有变通方法,即使服务器违反规则,它们也可以构建和验证证书链。Java 和 NodeJS/OpenSSL 客户端(以及其他客户端)不这样做,因此如果服务器无法发送正确的链,它们将无法通过验证。
如果这是一个公共 HTTPS服务器,https://www.ssllabs.com/ssltest会告诉你,除了(很多)关于 TLS 实现和配置的其他信息之外,服务器是否正在发送或丢失链证书. 对于其他服务器,还有其他工具,但我知道的那些需要用户的一些想法或知识。