已经有关于使用openssl生成自签名证书的答案,例如this。但是,我想要的是一个证书,它只能对预定义网站的流量进行身份验证和加密。
由以下命令生成的证书
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
将基本约束/证书颁发机构设置为YES
,这意味着它可用于签署其他证书。假设我的域名为mystackoverflow.com
,窃取我的私钥的攻击者不仅可以与mystackoverflow.com
进行MITM连接,还可以facebook.com
或google.com
,因为他可以使用所述私钥签署伪造证书并获得我的系统信任。
所以问题是,如何最大限度地降低此证书的功能,使其无法签署其他密钥,签名代码,加密电子邮件或执行除保护https连接到特定网站以外的任何其他内容?
答案 0 :(得分:1)
..窃取私钥的攻击者..
所以问题是,如何最大限度地降低此证书的功能,使其无法签署其他密钥,签名代码,加密电子邮件或执行除保护https连接到特定网站以外的任何其他内容?
如果您担心攻击者可能窃取证书的密钥然后使用它签署其他内容,那么您就不应该创建自签名证书。而是先创建自己的CA.然后创建一个叶证书,该证书不能用于签署证书并由您自己的CA签名。完成此操作后,将CA的私钥放在远处(离线甚至销毁它,如果您不需要它来签署更多证书)。
通过此设置,如果获取其私钥,攻击者仍然可以窃取证书的身份。但由于此证书不是CA本身(与普通的自签名证书不同),因此不能用于签署新证书。
答案 1 :(得分:1)
我想要的是一个证书,除了对预定义网站的流量进行身份验证和加密外,什么都不做...... 所以问题是,如何最大限度地降低此证书的功能,使其无法签署其他密钥,签名代码,加密电子邮件或执行除保护https连接到特定网站以外的任何其他内容?
这个问题有三个部分。
首先是如何“验证和加密[stuff]”。这是由密钥用法和扩展密钥用法处理的。特别是,digitalSignature
(签名密钥交换,如Diffie-Hellman),keyEncipherment
(密钥传输,如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装备。他们有扩展,但他们没有政策。因此,您需要确保您在内部和现有扩展中工作,而不是伪造新策略。有关详细信息,请参阅PKIX邮件列表中的OID for certificates issued under IETF policy?。
CA / B论坛很重要,因为浏览器遵循CA / B论坛规则,而不是IETF。 CA / B论坛和IETF在几个关键领域有不同的要求。这就是为什么使用OpenSSL创建的证书(遵循IETF指南)无法在浏览器中验证(遵循CA / B论坛指南)。
由以下命令生成的证书:
openssl req ...
使用 是如何做到的,但它的不是今天如何做到这一点。今天它产生格式错误的证书(可能会也可能不会导致问题,具体取决于您的用户代理)。对于你引用的问题,一个答案特别告诉你为什么它不正确以及如何做。