要解决的问题
非对称加密(公钥加密、私钥解密)解决了密钥分发问题——但带来新问题:
"我怎么知道这个公钥确实属于对方?"
如果攻击者把自己的公钥冒充成银行的公钥,你用"银行的公钥"加密的敏感信息,实际上只有攻击者能解密。
这叫中间人攻击(前文提到过)。
数字证书就是为了解决这个问题。
数字证书是什么
数字证书:由可信第三方(CA,证书颁发机构)签名的文件,把身份信息与公钥绑定在一起。
内容通常包括:
- 证书持有者的身份(如域名
example.com、组织名称); - 持有者的公钥;
- 签发者(CA)的名称;
- 有效期;
- 证书用途(如服务器认证、代码签名);
- CA 的数字签名。
验证过程
当你访问 HTTPS 网站:
- 服务器发来它的证书;
你的浏览器/操作系统检查:
- 签名是否有效(用 CA 的公钥验证);
- 证书是否在有效期内;
- 域名是否匹配(证书是为这个域名签发的吗);
- 证书是否已被吊销;
- 验证通过后,用证书中的公钥与服务器建立加密连接。
信任链
根 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 保护的是"通信不被窃听和篡改",不保证对方是好人。
说明:本文为网络安全的知识整理。