要解决的问题

非对称加密(公钥加密、私钥解密)解决了密钥分发问题——但带来新问题:

"我怎么知道这个公钥确实属于对方?"

如果攻击者把自己的公钥冒充成银行的公钥,你用"银行的公钥"加密的敏感信息,实际上只有攻击者能解密。

这叫中间人攻击(前文提到过)。

数字证书就是为了解决这个问题。

数字证书是什么

数字证书:由可信第三方(CA,证书颁发机构)签名的文件,把身份信息与公钥绑定在一起。

内容通常包括:

  • 证书持有者的身份(如域名 example.com、组织名称);
  • 持有者的公钥;
  • 签发者(CA)的名称;
  • 有效期;
  • 证书用途(如服务器认证、代码签名);
  • CA 的数字签名。

验证过程

当你访问 HTTPS 网站:

  1. 服务器发来它的证书;
  2. 你的浏览器/操作系统检查:

    • 签名是否有效(用 CA 的公钥验证);
    • 证书是否在有效期内;
    • 域名是否匹配(证书是为这个域名签发的吗);
    • 证书是否已被吊销;
  3. 验证通过后,用证书中的公钥与服务器建立加密连接。

信任链

根 CA 的公钥怎么保证可信?

答案:它预装在操作系统和浏览器中(信任库 / Root Store)。

厂商(微软、苹果、Mozilla、Google 等)维护着自己的根证书信任库,并严格审核哪些 CA 可以加入。

实际的证书通常是链式的:

根 CA(自签名,预装在系统中)
  └── 中间 CA(由根 CA 签名)
        └── 服务器证书(由中间 CA 签名)

为什么用中间证书:根 CA 的私钥极其重要(一旦泄露后果严重),因此通常离线保存,不直接签发服务器证书——用中间证书来做日常的签发工作。

浏览器验证时,从服务器证书一路验证到根证书,只要根证书在信任库中,整条链就可信。

证书吊销

如果证书的私钥泄露,或者签发有误,证书需要在到期前被吊销。

CRL(证书吊销列表):CA 定期发布一个被吊销证书的列表。

缺点:列表可能很大,且更新有延迟。

OCSP(在线证书状态协议):实时查询单个证书的状态。

缺点:每次连接都要额外请求,影响性能,且 OCSP 服务器本身可能不可用(或泄露用户访问的网站——因为查询是明文的)。

OCSP Stapling(OCSP 装订):由服务器定期获取 OCSP 响应并"装订"到 TLS 握手中发给客户端——既快又保护隐私。

证书透明度(Certificate Transparency,CT):

要求所有证书都公开记录在可审计的日志中。这样,如果 CA 错误地(或恶意地)为某个域名签发了证书,域名所有者可以检测到。

现代浏览器对未记录在 CT 日志中的证书会发出警告或拒绝。

证书的类型

DV(域名验证):只验证申请者控制该域名。签发快,可自动化(如 Let's Encrypt)。

OV(组织验证):验证组织的真实存在。

EV(扩展验证):最严格的验证。过去浏览器会给 EV 证书显示绿色的组织名称,但近年主流浏览器已弱化这一视觉区分。

通配符证书:*.example.com,覆盖所有子域名。

免费的证书

Let's Encrypt 自 2016 年起提供免费的 DV 证书,并推动了 ACME 协议的普及——使得证书的申请和续期可以完全自动化。

这大幅推动了全网 HTTPS 的普及。

注意:Let's Encrypt 证书有效期较短(90 天),因此需要自动续期——这也推动了自动化运维的普及。

一个常见误解

"HTTPS 证书证明这个网站是合法的/可信的。"

更准确的说法:证书证明"你正在与持有该域名私钥的一方通信",仅此而已。

一个钓鱼网站也可以申请到证书(DV 证书只验证域名控制权)。

HTTPS 保护的是"通信不被窃听和篡改",不保证对方是好人。

说明:本文为网络安全的知识整理。