是否可以在 X.509 规范的限制范围内将中间 CA 标记为受信任用于特定目的,例如验证 VPN、HTTPS 等服务器密钥,就像它与根 CA 一起工作一样?
我的 VPN 客户端都有办法明确提供受信任的 CA 证书,用于验证 VPN 服务器的真实性。只要我提供根 CA 证书,就可以按预期工作 - 证书是受信任的。(中间证书作为 TLS 握手的一部分提供。)
但是,我使用的是中间 CA,并且非常希望提供该证书,而不是根 CA。在我对 X.509 的理解中,这应该有效:
VPN 服务器的密钥由中间 CA 签名,据我了解 X.509,这就是建立可信链所需的全部内容。
但实际上,它不起作用:我的 VPN 客户端无法连接。
除了 VPN,我还尝试了 802.1X/EAPOL 身份验证和多个客户端 - 结果相同:向客户端提供根 CA 证书是可行的;提供我的中间 CA 证书不会。
这是设计使然,还是只是大多数实现的工作方式?
(我使用基于 TLS 的 VPN,但我也尝试过使用 802.1X 和 TTLS,它似乎与 TLS 或 X.509 有关,而不是与我特定的 VPN 客户端/服务器架构有关。)
更新: 我喜欢OpenSSL 提交,它实现了将非自签名 CA 证书添加为信任锚。不幸的是,这还没有包含在任何发布版本中,因此评论中提出的所有解决方法仍然适用。
更新 2:
OpenSSL 现在在发布版本中包含此选项,从 1.0.2 开始。命令行客户端的相应标志是partial_chain
,而编程标志似乎是X509_V_FLAG_PARTIAL_CHAIN
。
此外,我最近不得不用 Java 验证服务器证书:至少在 Sun JSSE 提供者的 SSL 实现的 JDK 1.8 版本中,在TrustManager
没有任何特殊配置的情况下将叶证书添加到默认工作,并且验证成功,就好像根 CA 已经假如。