SSL 证书框架 101:浏览器如何实际验证给定服务器证书的有效性?

信息安全 tls 证书 证书颁发机构 电子签名
2021-09-05 04:49:41

(抱歉,我知道这是一个完整的菜鸟问题,并且可能会发布一些重复的主题。我对公钥/私钥、散列、数字签名有基本的了解......我最近几天一直在搜索在线和堆栈论坛但似乎找不到满意的答案。)

示例: 我在开放的 wifi 上冲浪,我第一次浏览。服务器发回其 SSL 证书。我的浏览器会做它的事情并验证证书是否由它信任的 CA 签名并且一切正常。我在网站上四处点击。但!

问题: 真的有人可以简单地向我解释一下我的浏览器如何实际验证服务器证书是否合法?是的,好吧,证书本身说它是由“Verisign”颁发的,但是在幕后发生的实际加密魔法是什么,以验证它不是伪造的证书?我听说有人解释说“SSL 证书是使用签名 CA 的公钥验证的”,但这对我来说没有意义。我认为公钥是加密数据,而不是解密数据。

如此困惑...如果有人能启发我,我将不胜感激。提前致谢!

4个回答

SSL 使用非对称密钥对是正确的。生成一个公钥和一个私钥,也称为公钥基础设施 (PKI)。公钥是分发给世界的,用于加密数据。但是,只有私钥才能真正解密数据。这是一个例子:

假设我们都去 walmart.com 买东西。我们每个人都会得到一份沃尔玛公钥的副本来签署我们的交易。一旦交易被沃尔玛的公钥签名,只有沃尔玛的私钥才能解密交易。如果我使用我的沃尔玛公钥副本,它不会解密你的交易。沃尔玛必须保持他们的私钥非常私密和安全,否则任何人都可以解密到沃尔玛的交易。这就是为什么DigiNotar 漏洞如此严重的原因

现在您已经了解了私钥和公钥对的概念,重要的是要知道谁实际颁发证书以及为什么证书是受信任的。我对此过于简单化了,但是有特定的根证书颁发机构 (CA),例如 Verisign 签署证书,但也签署中间 CA。这遵循所谓的信任链,这是一个相互信任的系统链。请参阅下面链接的图像以获得更好的想法(注意根 CA 位于底部)。

简单的信任链

组织通常购买通配符证书或自己注册为中间 CA,授权其单独为其域签名。这会阻止 Google 为 Microsoft 签署证书。

由于这种信任链,证书可以一直验证到根 CA。为了证明这一点,DigiCert(和许多其他人)拥有验证这种信任的工具。DigiCert 的工具链接在这里我在 gmail.com 上进行了验证,当您向下滚动时,它会显示:

Gmail 信任证书

这表明 gmail.com 的证书是由 Google Internet Authority G2 颁发的,G2 又从 GeoTrust Global 颁发证书,而 GeoTrust Global 又从 Equifax 颁发证书。

现在,当您访问 gmail.com 时,您的浏览器不仅会得到一个散列块,而且会按原样进行。不,它会获得大量详细信息以及证书:

Google 公共证书详细信息

这些详细信息是您的浏览器用来帮助识别证书有效性的信息。例如,如果过期日期已过,您的浏览器将抛出证书错误。如果证书的所有基本细节都检出,它将一直验证到根 CA,证书是有效的。

现在您对证书详细信息有了更好的了解,这个类似于上面第一个的扩展图像有望更有意义:

证书信任链扩展

这就是为什么您的浏览器可以验证一个证书与下一个证书,一直到您的浏览器固有信任的根 CA。

希望这可以帮助您更好地理解!

为了澄清@PTW-105 的其他出色答案中未涵盖的问题的一点(并在@JVE999 的评论中提出):

我认为公钥是加密数据,而不是解密数据......

密钥可以双向工作 - 使用公钥加密的内容只能使用私钥解密,反之亦然我们只是决定一个是私有的,一个是公共的,没有概念上的区别。

因此,如果我加密要发送给您的数据,我会使用您的公钥对其进行加密,并且只有您可以使用您的私钥对其进行解密。

但是,如果我想签署某些东西以证明它来自我,那么我会生成消息的散列并用我的私钥加密该散列。然后任何人都可以用我的公钥解密它并与实际的消息哈希进行比较,但他们知道只有我可以加密它,因为只有我有我的私钥。所以他们知道自从我签名后消息哈希没有改变,因此它来自我。

根据评论,上述情况并不完全正确。请参阅@dave_thompson_085 评论中的链接然而,这不是一个“如何正确签名”的教程,只是阐明了私钥和公钥在加密和签名中的作用。这方面的基本观点是:

  • 为了加密数据,外部方使用公钥,只有私钥持有者可以解密它。
  • 为了签名,私钥持有者使用散列函数和他们的私钥(加上适当的填充等)。然后,外部方可以使用公钥验证签名。这确保了消息来自私钥持有者(假设没有其他人可以访问私钥)。

签名有时(取决于实现)可能使用与加密相同的密钥对完成,只是反过来使用,或者它可能使用不同的密钥对(参见另一个链接,也来自@dave_thompson_085 的评论)

除了签名验证之外,证书链验证还有一些其他元素。已经提到过,网站的 TLS 证书会被检查以确保证书中的域名与浏览器调用的域名匹配。其他应该检查的事情是基本约束不应该是 CA,密钥使用约束应该与密钥类型兼容;RSA 和 ECC 密钥可能需要不同的密钥使用权限才能正确协商 TLS 握手。在构建证书链时,从 CA 派生的链的长度可能会受到限制。这是 CA 的基本约束字段的一部分。可能存在政策限制,但我怀疑它们没有被浏览器检查。如果我错了,我会很高兴听到。

如果一个网站有一个有效的证书,这意味着一个证书颁发机构已经采取措施来验证这个网址实际上属于那个组织。当您键入 URL 或点击安全网站的链接时,您的浏览器将检查证书的以下特征: 网站地址与证书上的地址匹配 证书由浏览器的证书颁发机构 (CA) 签署被认为是“值得信赖的”权威

TLS 和 SSL 协议都使用所谓的“非对称”公钥基础设施 (PKI) 系统。非对称系统使用两个“密钥”来加密通信,一个“公共”密钥和一个“私人”密钥。任何用公钥加密的东西都只能用私钥解密,反之亦然。当您访问网站时,网站会显示您的浏览器验证并用于加密发送的数据(在您的浏览器和他们的服务器之间)的公钥,并且只有服务器/站点具有能够解密数据的私钥。

有关密钥的一些信息:非对称加密(或公钥加密)使用单独的密钥进行加密和解密。任何人都可以使用加密密钥(公钥)来加密消息。但是,解密密钥(私钥)是保密的。这样,只有预期的接收者才能解密消息。最常见的非对称加密算法是 RSA;但是,我们将在本文后面讨论算法。

完全归功于这些网站:

https://www.us-cert.gov/ncas/tips/ST05-010

https://www.digicert.com/ssl-cryptography.htm