自签名CA和自签名证书的区别

95
我不太清楚CA密钥和证书之间的区别。难道CA密钥不就是一个证书吗?让我通过一个例子来澄清一下。
我有一个客户端和一个服务器。我只想验证与我的服务器的连接,而不是尝试建立对其他人的信任,因此我不关心使用真正的CA进行签名。
选项1:生成自签名CA(ssCA)并使用它来签署证书(C)。然后将ssCA安装到客户端的根密钥库中,并设置我的服务器使用证书C。
选项2:生成自签名证书(SSC)。将SSC安装到客户端的根密钥库中。设置我的服务器使用证书SSC。
第二个选项似乎是一个更简单的过程。那仍然有效吗?

1
我将关闭此问题,因为它不符合[help/on-topic]中所述的实际编程问题的范畴。 - Martijn Pieters
5个回答

71
首先,关于密钥和证书(关于“CA密钥”),在讨论公钥证书(通常是X.509)时会用到三个部分:公钥、私钥和证书。
公钥和私钥构成一对。您可以使用私钥进行签名和解密,可以使用公钥进行验证(签名)和加密。公钥旨在被分发,而私钥则要保持私密。
公钥证书是公钥和各种信息(主要涉及密钥对所有者的身份,即控制私钥的人)的组合,使用证书颁发机构的私钥进行签名。
X.509证书有一个主题可区分名称和一个发行者可区分名称。发行者名称是颁发证书实体的证书的主题名称。自签名证书是一种特殊情况,其中发行者和主题相同。
通过签署证书的内容(即颁发证书),发行者断言其内容,特别是密钥、身份(主题)和各种属性之间的绑定(这些属性可能指示证书的意图或使用范围)。
此外,PKIX规范定义了一个扩展(给定证书的一部分),指示是否可以将证书用作CA证书,也就是说,是否可以将其用作另一个证书的颁发者。
基于此,您可以在最终实体证书(您要为用户或服务器验证的证书)和信任的CA证书之间构建一条证书链。最终服务的端实体证书和您信任的CA证书之间可能存在中间CA证书(由其他CA证书颁发)。您不严格需要在顶部拥有根CA(自签名CA证书),但通常情况下会这样做(如果您愿意,可以直接信任中间CA证书)。

针对您的使用情况,如果您为特定服务生成自签名证书,则是否具有CA标志(基本限制扩展)并不重要。只有当您想要构建自己的PKI时,才需要它成为CA证书以便能够签发其他证书。如果您为此服务生成的证书是CA证书,那么它不应该造成任何伤害。更重要的是您如何配置客户端信任该证书以用于此特定服务器(例如,浏览器应该可以轻松地创建显式例外)。如果配置机制遵循PKI模型(而不使用特定例外),由于不需要构建链路(只有一张证书),您应该能够将证书直接导入客户端的信任锚点,而无论它是否为CA证书(但这可能取决于客户端的配置机制)。


1
感谢提供的信息。我会给Helge正确的答案,因为它更早并且更简洁。不过,这也是很有用的知识。 - Pace
一个被攻击的CA证书会造成更多的损害(会影响客户端信任的所有TLS连接),而特定的证书只会影响该证书所颁发的用例。 - Marco Kinski
@MarcoKinski 没错。这就是为什么你应该在自己生成的CA证书中添加名称约束。这样,即使是一个被攻击的自我生成的CA证书的私钥也不能用于中间人攻击你与外部服务之间的流量。(即不符合名称约束的服务) - Alexander Stumpf

69

两种选项都是有效的,选项2更简单。

当您需要多个证书时,选项1(设置自己的CA)更可取。在公司中,您可能会建立自己的CA,并将该CA的证书安装在所有客户端的根密钥库中。然后,这些客户端将接受由您的CA签名的所有证书。

选项2(自签名证书而无需CA)更容易。如果您只需要一个单独的证书,那么这就足够了。将其安装在客户端的密钥库中即可。但是,当您需要第二张证书时,您需要再次在所有客户端上安装它。

此处是进一步信息的链接:创建证书颁发机构和自签名SSL证书


如果一个证书授权机构签署了一个证书,我仍然可以只信任生成的证书(在这种情况下是C),知道我只需要信任由证书授权机构生成的每个证书,而不是来自证书授权机构的一个证书吗? - ivandov
@ivandov 这取决于客户端。通常应该是可能的,但有些浏览器(你好,Chrome!)不再相信叶证书。您仍将收到错误消息。 - Alexander Stumpf

10
你可以使用openssl x509 -noout -text -in $YOUR_CERT来查看文件内容的差异:
在你的自签名CA中,你可以看到:
    X509v3 extensions:                                                          
        X509v3 Basic Constraints:
            CA:TRUE, pathlen:0

在您的自签名证书中,它是这样的:

    X509v3 extensions:                                                          
        X509v3 Basic Constraints:
            CA:FALSE

2

如果您需要更多的证书(C),您需要创建一个自签名CA(ssCA)。
如果您只需要一个证书,您可以创建一个自签名证书(SSC)。
为了信任单个证书(SSC),您需要将SSC安装到客户端的根密钥库中。
如果您需要同时信任多个证书,则需要创建一个自签名CA(ssCA),然后将ssCA安装到客户端的根密钥库中。


0

您必须始终拥有根CA,CA具有可用于签署较低级别证书的密钥和可嵌入客户端接受的根证书,用于验证较低级别证书以检查其是否有效。自签名只是意味着您是自己的CA。每当创建自签名证书时,您都需要创建一个CA,然后使用该CA签署站点证书。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接