如何使用 openssl *以最小的功率创建 CA*

How to create a CA with openssl *with minimal power*

已经有关于使用 openssl 生成自签名证书的答案,例如 this。但是,我想要的是一个证书,它只能对预定义网站的流量进行身份验证和加密。

通过以下命令生成的证书

 openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365

已将基本约束/证书颁发机构设置为 YES,这意味着它可用于签署其他证书。假设我的域是 mywhosebug.com,窃取我的私钥的攻击者不仅能够通过 MITM 连接到 mywhosebug.com,而且还能够连接到 facebook.comgoogle.com,因为他可以使用上述私钥签署伪造的证书并获得我的系统的信任。

所以问题是,我如何最大限度地降低此证书的功能,使其无法签署其他密钥、签署代码、加密电子邮件或执行除保护与特定网站的 https 连接之外的任何其他操作?

.. an attacker who steals my private key ..

So the question is, how do I minimize the power of this certificate so that it cannot sign additional keys, sign codes, encrypt emails or do anything other than protect https connection to a specific website?

如果您担心攻击者可能窃取证书密钥然后用它签署其他内容,那么您不应该创建自签名证书。而是首先创建您自己的 CA。然后创建一个不能用于签署证书并由您自己的 CA 签署的叶证书。完成此操作后,将 CA 的私钥放在很远的地方(离线,如果不需要它来签署更多证书,甚至将其销毁)。

使用此设置,如果攻击者获得证书的私钥,它仍然可以窃取证书的身份。但由于此证书本身不是 CA(与普通的自签名证书不同),因此不能用于签署新证书。

I want is a certificate that can do nothing but authenticate and encrypt the traffic to predefined websites... So the question is, how do I minimize the power of this certificate so that it cannot sign additional keys, sign codes, encrypt emails or do anything other than protect https connection to a specific website?

这个问题分为三个部分。

首先是如何"authenticate and encrypt [stuff]"。这由 Key Usage 和 Extended Key Usage 处理。特别是 digitalSignature(签名密钥交换,如 Diffie-Hellman)、keyEncipherment(密钥传输,如 RSA)、serverAuth

其次是如何铸造证书。对于终端实体证书(即服务器证书),您删除 CA=true 基本约束并删除 keyCertSign 位。您仍然需要一个能够签署最终实体证书的中间 CA,因为那是应用 "this CA can only issue for these names" 策略的地方。

第三是如何应用像"this CA can only issue for these names"这样的策略。根据 PKIX in RFC 5280 的 IETF 规则,您可以在具有名称约束扩展名的 CA 证书中执行此操作。详情见 4.2.1.10 节。

CA/Browser Forum rules下,你可以做到,因为他们有政策对象。但是不知道在CA/B下怎么办(可能和IETF一样)

你必须小心 IETF 装备。他们有延期,但没有政策。因此,您需要确保您在现有扩展范围内工作,而不是制定新政策。有关详细信息,请参阅 PKIX 邮件列表中的 OID for certificates issued under IETF policy?

CA/B 论坛很重要,因为浏览器遵循 CA/B 论坛规则,而不是 IETF。 CA/B 论坛和 IETF 在几个关键领域有不同的要求。这就是使用 OpenSSL(遵循 IETF 指南)创建的证书无法在浏览器(遵循 CA/B 论坛指南)中验证的原因。


A certificate generated by the following command: openssl req ...

是怎么做的,不是怎么做的今天。今天它生成格式错误的证书(这可能会或可能不会导致问题,具体取决于您的用户代理)。对于你提到的问题,有一个答案特别告诉你为什么不正确以及如何做。