(发布到 ServerFault 而不是 StackOverflow,因为我觉得它涉及操作系统配置比编程代码更多)。
我目前负责维护一个连接到第三方 Web 服务的系统。此 Web 服务需要客户端身份验证证书,这很合理,但 Web 服务本身使用自签名证书进行保护,该证书由自创建的根证书颁发机构证书创建 - 该根证书与创建客户端身份验证证书的根证书相同。
仅将当前服务证书添加到已知受信任列表并忽略自创建的颁发机构证书就足够了,但不幸的是,服务证书会定期更改,因此必须信任颁发机构证书以确保在更新服务证书时应用程序不会中断。
但是,根据我与运行 Web 服务的公司打交道的经验,我(个人)并不信任 CA 证书 - 如果它泄露到网络上,我不会感到惊讶 - 而且令人担忧的是,CA 证书没有设置密钥使用限制(虽然外部 MITM 攻击是可能的,尽管距离很远,但我更担心用于代码签名的证书泄露)。
我是否可以告诉我的计算机(当前是服务器机箱,但将来是普通的桌面客户端机箱)信任 CA,但仅限于给定的一组密钥用法和一小组可能的主题名称(域名)?
该服务器当前是 Windows Server 2012 R2,但它可以在 Linux 机器上运行 - 尽管台式机都是 Windows 机器。
答案1
是的,这是可能的。在 Windows 中,有一项称为“交叉认证”或“合格从属”的功能。
这个想法是,您在自己的环境中签署第三方颁发的 CA 证书。结果,远程 SSL 证书链接到您自己的根 CA 证书。为了保护自己免受可能的恶意证书的侵害,您可以实现证书Name Constraints
扩展,在其中指定可接受名称的列表。如果第三方 CA 为任何其他名称颁发证书(名称约束扩展中未明确指定),您的 CryptoAPI 提供程序将自动拒绝该证书。
除了名称约束之外,您还可以通过Application Policies
在交叉证书中定义证书扩展来描述增强型密钥用法约束。因此,您的信任提供商将仅成功验证扩展中指定的用法Application Policies
。
更多信息:使用 Windows Server 2003 规划和实施交叉认证和合格从属关系
ps 虽然本文是针对 Windows Server 2003 撰写的,但本文仍然适用于最新的 Windows Server 版本。