首页/我的作品/密码学/8.3 数字证书:让信任可以传递
密码学:守护数字世界的秘密

8.3 数字证书:让信任可以传递

第 46 / 78 篇 · Crazy Boy

在上一节,我们学会了如何用私钥签名、用公钥验证。现在,你有了一个强大的工具:任何人都可以用你的公钥验证你的签名,从而确认你的身份。但有一个关键问题还没有解决:你怎么知道某个公钥真的属于某个人?

想象一下,你收到一封电子邮件,发件人声称是“小明”,并附上了一个公钥,让你用它验证邮件的签名。你该如何确认这个公钥真的是小明的?也许它是一个攻击者伪造的,用他自己的公钥冒充小明。如果你用了这个假公钥去验证签名,结果当然也“验证通过”,但邮件可能是假的。

这就是数字世界里的“身份信任”问题。我们需要一种机制,把“公钥”和“身份”可靠地绑定在一起。数字证书就是解决这个问题的钥匙。

从身份证到数字证书

想想你生活中的身份证。当你去银行开户,柜员会检查你的身份证,确认你是你本人。为什么银行相信身份证?因为身份证是由公安局(权威机构)签发的,它有防伪特征,难以伪造。银行信任公安局,所以信任公安局签发的身份证。

数字证书扮演了同样的角色。它是一个电子文件,把“公钥”和“身份信息”绑定在一起,并由一个被称为证书颁发机构(Certificate Authority,CA)的第三方进行数字签名。这个签名证明了:这个公钥确实属于这个实体。

当你收到一个证书,你可以验证它的签名是否有效。如果你信任这个CA,那么你就可以信任这个证书里的公钥。这就是“信任可以传递”的含义:信任CA → 信任证书 → 信任公钥。

数字证书里有什么?

一张数字证书(最常见的是X.509标准)包含以下关键信息:

  • 主体:证书持有者的信息,比如域名(www.example.com)、组织名称、地理位置等。
  • 公钥:持有者的公钥(比如RSA公钥或ECDSA公钥)。
  • 有效期:证书的有效起止时间。
  • 颁发者:签发此证书的CA的名称。
  • 签名:CA用自己的私钥对以上所有信息进行数字签名。
  • 序列号:CA为证书分配的唯一编号。
  • 扩展字段:如密钥用途(用于签名还是加密)、证书策略等。

你可以把证书想象成一张电子身份证,上面印着你的照片(公钥)和你的个人信息(主体),并盖有公安局(CA)的章(签名)。

证书是如何签发的?

证书的签发过程大致如下:

  1. 申请:网站所有者生成一对密钥,然后把公钥和自己的身份信息(如域名)发送给CA。
  2. 验证:CA通过各种方式验证申请者的身份。对于普通的网站证书,CA会验证申请者是否真正控制了该域名(比如通过邮件或DNS记录)。对于更高等级的组织验证(OV)和扩展验证(EV)证书,验证会更严格,甚至要求提供营业执照等文件。
  3. 签发:CA把申请者的公钥和身份信息打包,再加上自己的信息、有效期等,形成一个证书文件。CA用自己的私钥对这个证书进行签名,生成签名值,附在证书中。
  4. 交付:CA把签好的证书返回给申请者。

申请者把证书部署在服务器上。当客户端(浏览器)访问服务器时,服务器会发送自己的证书。客户端用CA的公钥验证证书签名,确认证书有效且未被篡改,然后取出证书中的网站公钥,用于后续的加密通信。

信任链:一层一层的信任

你可能见过这样的场景:一个证书的签发者可能不是顶级的CA,而是一个中间CA。比如,顶级CA(根CA)给一个中间CA签发证书,中间CA再给网站签发证书。这就形成了一条信任链:

根CA → 中间CA → 网站证书

验证过程从最底层的网站证书开始:用中间CA的公钥验证网站证书的签名;如果有效,再用根CA的公钥验证中间CA证书的签名;如果有效,就信任根CA。最终,只要根CA是可信的,整条链上的证书都是可信的。

为什么要有中间CA?因为根CA的私钥太宝贵了,通常保存在离线状态,很少直接用来签发网站证书。中间CA可以承担日常签发任务,即使中间CA私钥泄露,也可以被吊销,而不至于威胁根CA。另外,中间CA也可以代表不同的验证级别和业务方向。

根证书:信任的起点

那么,你如何信任根CA呢?答案是:操作系统和浏览器内置了一批根证书。这些根证书属于全球公认的CA,如DigiCert、GlobalSign、Let’s Encrypt等。当你安装操作系统或浏览器时,它们自带了这些根证书的公钥。默认情况下,你信任这些CA。

也就是说,信任的起点是“预置”。你可以选择信任某些根证书,也可以自己添加或删除它们。当你访问一个网站时,浏览器会检查网站证书的签发链,一直追溯到某个已预置的根证书。如果整个链条都有效,浏览器就认为网站可信,并显示绿色锁。

证书验证过程(以HTTPS为例)

当你访问https://example.com时,浏览器做以下几件事:

  1. 服务器发送它的证书(以及可能需要的中间证书链)。
  2. 浏览器检查证书有效期,确认未过期。
  3. 浏览器验证证书的签名是否有效(用CA的公钥)。
  4. 浏览器检查证书中的域名是否与你访问的域名一致(防止中间人攻击)。
  5. 浏览器向上追溯证书链,直到找到一个本地信任的根证书。
  6. 如果所有检查通过,浏览器认为服务器身份可信,继续后续的TLS握手(包括交换密钥等)。

如果任何一项检查失败,浏览器会显示警告页面,提示“您的连接不是私密连接”。

信任模型并非完美

虽然PKI(公钥基础设施)体系已经运行多年,但它并非没有问题:

  • CA被攻破:如果某个CA的私钥泄露,攻击者可以签发任何域名的假证书,从而冒充网站。历史上曾发生过多次CA安全事件,导致某些CA被撤销信任。
  • 错误签发:CA可能误发证书,把证书签发给未授权的人。比如,有人伪造了身份证明,CA可能不小心给他发了证书。
  • 国家行为:某些国家可能迫使CA签发假证书用于监控。

针对这些问题,业界采取了多种措施:证书透明(CT)日志要求所有公开证书必须发布到公开日志中,便于发现误发证书;加强CA审核;使用HTTP公钥钉扎(HPKP)等机制(但后来因实施复杂被放弃)。现代的浏览器也增加了更严格的检查,比如要求证书有效期内、使用现代加密算法等。

小结

数字证书是公钥基础设施的核心组件,它通过权威机构的签名,把公钥和身份绑定在一起,让信任可以传递。从根CA到中间CA,再到网站证书,形成了一条信任链。每当你访问HTTPS网站、下载经过签名的软件、查看电子合同,背后都有数字证书在默默工作。

下一节,我们将动手用OpenSSL生成自己的证书,亲身体验整个签发过程。你将看到证书的庐山真面目,并学会如何用命令行创建、签名和验证证书。