信任不可信的CA-我可以限制系统信任它的方式吗?


32

(发布到ServerFault而不是StackOverflow,因为我认为它比编程代码更关注OS配置)。

我目前负责维护连接到第三方Web服务的系统。此Web服务需要客户端身份验证证书,这很公平,但是Web服务本身由由自行创建的根证书颁发机构证书(与创建客户端身份验证证书的根相同)创建的自签名证书来保护。

仅将当前服务证书添加到已知受信任列表中,而忽略自己创建的权限证书就足够了,不幸的是,服务证书会定期更改,因此必须信任权限证书以确保应用程序在以下情况下不会中断:服务证书已更新。

但是,根据我在运行Web服务的公司的经验,我不(个人)信任CA证书-如果它泄漏到Web上也不会令我感到惊讶-并且令人担忧,CA证书没有对密钥使用的限制它(虽然可能是外部MITM攻击,尽管是远程的,但我更担心用于代码签名的证书泄漏)。

是否可以告诉我的计算机(当前是服务器箱,但在将来的普通台式机客户机箱中)信任CA,但仅针对给定的一组键用法和一小部分可能的使用者名称(域名) )?

该服务器当前为Windows Server 2012 R2,但它可以在Linux机器上运行-尽管台式机都是Windows机器。


3
至少在Linux上,许多应用程序都可以选择指定对等CA证书的位置,因此您可以将此CA的范围限制为仅使用它的应用程序。@CryptoGuy的答案在Linux上也适用,其中没有Windows特定的内容。
Edheldil'5

1
@Edheldil:尽管它是特定于实现的-例如Windows支持X.509名称约束的时间比NSS或GnuTLS更长。
grawity

您的系统连接到该第三方服务;是否可以将系统上的客户端代码配置为信任该服务的CA,以使其仅针对该客户端代码而不是针对整个系统完成?
卡斯塔利亚(Castaglia)'16

@Castaglia我可以编写自己的证书验证代码,该代码验证代码独立于主机系统运行,但是我无法控制其他客户端软件使用的系统范围证书服务。

Answers:


40

对的,这是可能的。在Windows中,有一个称为“交叉认证”或“合格从属”的功能。

这个想法是您在您的环境中签署第三方的颁发CA证书。结果,远程SSL证书链接到您自己的根CA证书。为了保护自己免受可能的流氓证书侵害,可以实现Name Constraints证书扩展,在其中指定可接受名称的列表。如果第三方CA颁发了其他任何名称的证书(在“名称约束”扩展名中未明确指定),则CryptoAPI提供程序将自动拒绝该证书。

除了名称约束之外,您还可以通过Application Policies在交叉证书中定义证书扩展来描述增强的密钥用法约束。因此,您的信任提供者将仅成功验证Application Policies扩展名中指定的用法。

详细信息:使用Windows Server 2003规划和实施交叉认证和合格从属

ps尽管本文是针对Windows Server 2003编写的,但本文仍适用于最新的Windows Server版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.