已经有关于使用 openssl 生成自签名证书的答案,例如 this 。但是,我想要的是一个除了对预定义网站的流量进行身份验证和加密之外什么也不做的证书。
通过以下命令生成的证书
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
将基本约束/证书颁发机构设置为YES
,这意味着它可用于签署其他证书。假设我的域名是 mystackoverflow.com
,窃取我私钥的攻击者不仅能够 MITM 与 mystackoverflow.com
的连接,还能够攻击 facebook .com
或 google.com
,因为他可以使用上述私钥签署伪造的证书并获得我的系统的信任。
所以问题是,如何最小化此证书的功能,使其无法签署额外的 key 、签署代码、加密电子邮件或执行除保护与特定网站的 https 连接之外的任何操作?
最佳答案
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?
这个问题分为三个部分。
首先是如何“验证和加密[东西]”。这是由 key 用法和扩展 key 用法处理的。特别是,digitalSignature
(签名 key 交换,如 Diffie-Hellman)、keyEncipherment
( key 传输,如 RSA)、serverAuth
等.
第二是如何不类型转换证书。对于最终实体证书(即服务器证书),您可以删除 CA=true
基本约束并删除 keyCertSign
位。您仍然需要一个能够签署最终实体证书的中间 CA,因为这就是应用“此 CA 只能为这些名称颁发”策略的地方。
第三是如何应用“该 CA 只能为这些名称颁发”之类的策略。根据 IETF 的规则 PKIX in RFC 5280 ,您可以使用名称约束扩展在 CA 证书中执行此操作。详细信息请参见第 4.2.1.10 节。
下CA/Browser Forum rules ,你可以这样做,因为他们有策略对象。但我不知道在CA/B下怎么做(可能和IETF一样)。
您必须小心使用 IETF 设备。他们有延期,但没有政策。因此,您需要确保您在现有的扩展范围内工作,而不是制定新的政策。请参阅OID for certificates issued under IETF policy?在 PKIX 邮件列表上了解更多详细信息。
CA/B 论坛很重要,因为浏览器遵循 CA/B 论坛规则,而不是 IETF。 CA/B 论坛和 IETF 在几个关键领域有不同的要求。这就是为什么使用 OpenSSL(遵循 IETF 准则)创建的证书无法在浏览器(遵循 CA/B 论坛准则)中验证的原因。
A certificate generated by the following command:
openssl req ...
它过去是如何做的,但它不是今天如何做。今天,它生成了一个格式错误的证书(这可能会也可能不会导致问题,具体取决于您的用户代理)。对于您引用的问题,一个答案特别告诉您为什么它不正确以及如何做到这一点。
关于security - 如何使用 openssl *以最小的功率* 创建 CA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28647657/