OpenSSL中的自签名证书是什么意思?

5

我是一个OpenSSL工具的新手,有些概念我不太理解。您能为我解释一下这些概念吗?比如说CA自签名证书或者任何其他概念都可以帮助我更好地理解。

(如果我使用了错误的术语或语法,请您见谅,我正在学习英语语言。)


你需要了解公钥基础设施(PKI)才能理解证书的含义。 - Balamurugan
3个回答

5
证书的目的是以一种可验证的方式声明信息。在这个上下文中,公钥证书,更具体地说是X.509证书,声明了公钥、标识符(主题可分辨名称和/或主题备用名称)和各种其他属性之间的绑定。所有这些信息都被签名,以形成证书。
X.509证书既有发行者又有主题。主题是表示证书标识的标识符(拥有与此证书中的公钥匹配的私钥的人或事物),而发行者则代表使用其私钥签署此证书的人或组织的标识符。
证书的使用可以广泛分为两类:用于特定应用程序或服务的证书(例如,身份验证SSL/TLS服务器)和用于证明其他证书有效性的证书。
对于后者,证书被用作公钥基础设施(PKI)的构建块。认证机构(CA)是颁发证书的机构:它签署将证书中的公钥与主题绑定的声明。这样做时,它会将自己的名称作为颁发者名称放入所颁发的证书中。
如果你把证书和护照(将你的照片和姓名绑在一起)进行比较,CA就是你的护照机关:他们实际上认证了护照所说的内容是真实的,以便其他人能够验证它。
信任CA可以让你相信它发行的证书。你可以在你信任的CA和由这些CA颁发的你之前没有见过的证书之间建立信任链。
随之而来的是“引导”问题:你如何信任CA本身?
自签名证书是发行者和主题相同的证书;它们用包含公钥的私钥签名。它们位于信任链的顶部。它们往往是CA证书(除非为特定服务量身定制,否则您无法在外部验证时信任)。
CA证书是可用于发行/验证其他证书的证书。(如果它们位于根/自签名CA证书和你希望验证的证书之间的链中间,它们可以是中间CA证书。)定义证书如何用于验证其他证书的规则在PKIX specification (RFC 3280/5280)中定义。
浏览器和操作系统预装了一份默认信任的CA证书列表。这些证书大多数来自商业颁发机构,他们会检查服务证书中的信息并收取费用。作为回报,你可以信任他们所颁发证书的内容(但这不是完美的系统)。这里需要有一个“信任飞跃”,因为你需要相信浏览器/操作系统只包含声誉良好的CA证书。
如果你使用openssl s_client,并且看到类似于“链中的自签名证书”或“无法验证证书”的消息,这并不一定意味着出现了问题,但是openssl默认不使用预定义的受信任CA证书列表。它的大多数命令都有像-CAfileCApath这样的选项,允许你指定你愿意信任哪些CA证书。
服务的自签名证书是一种特殊情况,其中服务自行声明其内容。你通常无法验证此类证书的真实性,除非你有一种外部方式来信任它(例如,如果你在计算机上自己安装了它并手动检查了其内容,或者如果你信任的某人将其给了你)。

(您可能也对这个问题感兴趣,关于如何使用HTTPS服务器证书。)


2
一般证书的目的是建立信任链:“我信任这个第三方公司,他们信任你,因此我可以信任你。” 自签名证书意味着您自己生成了它,因此我并没有对您的信任增加。 (这些非常适合测试,但其他用途不大。)另一种类型是可信证书,通过让知名公司出售给您(例如Verisign)来获得。这是一个商品市场,因此各公司的价格相当一致。这取决于证书的预期使用和范围。(例如,用于签署Android应用程序的证书与用于验证https://www.example.com/的证书非常不同。)
“CA”或证书颁发机构是发行证书的公司。在可信证书的情况下,它就是那家公司,例如Verisign。在自签名证书的情况下,CA是您,即您颁发了该证书。

如果您创建自己的私有CA并使用它来签署自己服务的证书,则仍适用于您使用的术语“您自己生成了它”。但这并不意味着服务证书是“自签名的”。它仍然由(不受信任的)CA签名。这听起来可能像吹毛求疵,但我有时会看到由某人自己的CA签名的证书错误地称为自签名证书,这就是为什么我想指出这种区别的原因。 - Alexander Stumpf
@AlexanderStumpf 您是正确的。还有第三种类别:“我是自己的CA”,在这种情况下,它在内部受信任(因为您已将公共证书添加到所有计算机中),但在外部不受信任。 - robrich
如果我创建自己的CA并使用其签署我的服务证书,那么服务证书就不是自签名的。答案的最后一段在这方面是具有误导性的。自签名证书是一种其签名可以使用同一证书的公钥进行验证的证书。 - Alexander Stumpf
@AlexanderStumpf 你在技术上是正确的,但我们正在纠缠于细节。更确切地说,如果您创建自己的CA,则它不受公共信任,因此您必须采取行动以使其在需要使用它的每台计算机上得到信任。 CA是自签名的,因为您自己签名了它,尽管如果您从中创建派生(正确未自签名但仍不受公众信任)证书,则可能会出现信任链。 mkcert非常适合本地开发。可惜,在大多数用例中,“创建自己的CA”仍然是边缘情况。 - robrich
@robrich 我对“创建自己的CA”有不同的看法,但这可能是因为不同的视角,在我的工作环境中,这更多是规则而不是边缘情况。(在K8s环境中使用集群CA) - Alexander Stumpf
显示剩余2条评论

0

自签名证书在大多数浏览器中会引起某种形式的“不受信任”的警报,询问您是否要继续并添加异常等。但这并不意味着连接不安全 - 它仍然是通过SSL进行的。

通常CA会收取费用,但如果您搜索一下,也有一些免费的CA可用。


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