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