【问题标题】:How to create a CA with openssl *with minimal power*如何使用 openssl *以最小的功率创建 CA
【发布时间】:2015-04-23 05:37:39
【问题描述】:

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

由以下命令生成的证书

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

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

所以问题是,我如何最小化此证书的功能,使其无法签署额外的密钥、签署代码、加密电子邮件或执行除保护与特定网站的 https 连接之外的任何事情?

【问题讨论】:

  • 这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super UserInformation Security Stack Exchange 会是一个更好的提问地点。
  • 很抱歉投票结束。我认为这是一个好问题,你得到了我的支持。
  • @jww:我也想过在超级用户或安全上发帖。但是我在SO上发现了各种类似的问题,所以我在这里发布了。
  • 我不会太担心。我倾向于对主题性和非主题性更加严格,所以我会关闭任何与编程或开发没有直接关系的东西。编程和开发问答是 SO 的主要目标,所以所有问题都必须通过我的嗅探测试。社区比较宽容,通常很乐意将这样的问题提出来。

标签: security ssl openssl certificate pki


【解决方案1】:

我想要的是一个证书,它除了对预定义网站的流量进行身份验证和加密之外什么都不做…… 所以问题是,我如何最小化这个证书的力量,使它不能签署额外的密钥、签署代码、加密电子邮件或做除了保护与特定网站的 https 连接之外的任何事情?

这个问题分为三个部分。

首先是如何“验证和加密 [stuff]”。这由 Key Usage 和 Extended Key Usage 处理。特别是,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 ...

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

【讨论】:

  • 我重新阅读了我引用的问题,所有答案都建议使用openssl req。我错过了什么?
  • @Siyuan - openssl req 会把名字放在CN里,不正确。您需要引用问题中的this answer。它告诉你不要把名字放在CN中;而是将其放在 SAN 中。要将 SAN 用于名称,您必须使用 OpenSSL CONFIG 文件,因为命令行工具缺少该功能。缺少 CONFIG 文件对我来说是一个危险信号。它告诉我你做错了事。 (您仍然可以使用 CONFIG 文件做错事,但这是另一天的另一个问题;)
  • 我接受了您的回答,它可能对未来的读者有所帮助。但我决定改用 ssh 隧道来保护我的连接。与自定义证书不同,SSH 更容易配置,而且几乎不可能打开安全漏洞。
  • @Siyuan - 我想你可能做出了正确的选择。
【解决方案2】:

.. 窃取我私钥的攻击者..

所以问题是,我如何最小化此证书的功能,使其无法签署额外的密钥、签署代码、加密电子邮件或执行除保护与特定网站的 https 连接之外的任何事情?

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

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

【讨论】:

  • Eh,你能举个简单的例子,说明我执行哪些命令来创建自己的 CA、叶子证书并用前者签署后者?我尝试阅读openssl的手册,但是很混乱。
  • 这已经被记录了很多。请使用google
  • 我也考虑过签署叶子证书并在问这个问题之前用谷歌搜索。但是网上的各种方法似乎各有千秋。一些使用req 命令,一些声称openssl req 已被弃用;有人说我需要在执行命令之前编辑一些配置文件。其中一些正在使用sha1、1024 位 RSA 密钥或其他不安全的参数。这就是为什么我转向 stackoverflow 以获得更明确和最新的安全标准答案。
  • 基本上我在网上找到的教程几乎都包含当今世界的一些弱算法,我不知道这些教程还有多少弱点。这是安全问题;非专业人士没有能力区分好建议和坏建议。我不能只是复制粘贴命令并验证它是否有效;它仅在实际利用弱点之前起作用。
  • 我得到的第一个命中是jamielinux.com/articles/2013/08/…,它看起来很安全,即使用 SHA-256 和 RSA 4096。它内容广泛且写得很好,比我在这里做的要好得多。
猜你喜欢
  • 2013-02-11
  • 2013-11-30
  • 2015-08-06
  • 2021-09-27
  • 2019-07-28
  • 1970-01-01
  • 2019-04-30
  • 2016-12-18
  • 2020-05-14
相关资源
最近更新 更多