数字证书是什么?证书链是如何验证的?
简化版
数字证书是由权威机构 CA 签发的「身份证」,它把服务器的公钥和域名绑定在一起,并由 CA 用自己的私钥签名。浏览器验证时,用内置的 CA 公钥验签,确认这个公钥确实属于这个域名。证书链是「网站证书 → 中间 CA → 根 CA」的信任链条,浏览器逐级验签直到某个内置信任的根证书,全链通过才信任。
详细版
证书里有什么:服务器域名、服务器公钥、颁发者(CA)、有效期,以及最关键的——CA 用私钥对以上内容的数字签名。
为什么需要证书:非对称加密要用服务器公钥,但「怎么确认这个公钥真属于目标网站、不是中间人伪造的」是个问题。证书就是由可信第三方(CA)为「公钥属于某域名」这件事背书。
证书链验证过程:
- 服务器发来自己的证书(叶子证书)+ 中间证书;
- 浏览器取中间 CA 的公钥验证叶子证书的签名;
- 再取根 CA 的公钥验证中间证书的签名;
- 根证书是浏览器/操作系统预置的、天然信任的;
- 一路验签到受信任的根证书,且域名匹配、未过期、未吊销,才判定证书可信。
完整版教学
一、证书要解决的核心问题:公钥可信
HTTPS 加密要用服务器的公钥。但公钥是在网络上传过来的,有个致命疑问:你怎么知道拿到的公钥真是目标网站的? 万一中间人把自己的公钥冒充成网站的发给你,你用它加密,中间人就能解密一切。
数字证书就是为了解决**「公钥归属」的可信问题**:它不是加密手段,而是一种身份背书——由一个大家都信任的第三方(CA)出面证明「这个公钥确实属于这个域名」。就像身份证由公安局背书证明「这张脸对应这个人」。
二、CA 怎么背书:用签名
CA 背书的手段是数字签名:
- 网站向 CA 申请证书时,CA 核验网站对域名的所有权;
- CA 把「域名 + 网站公钥 + 有效期」等信息用CA 自己的私钥签名,打包成证书;
- 浏览器收到证书后,用CA 的公钥验证这个签名。签名验证通过,就说明这份证书确实是该 CA 签发的、内容没被篡改。
中间人想伪造证书,就得伪造 CA 的签名——但它没有 CA 的私钥,签不出来。所以伪造的证书会验签失败,冒充被识破(详见「数字签名」那道题)。
三、证书链:信任是怎么一级级传递的
问题又来了:验证网站证书要用 CA 的公钥,那 CA 的公钥又怎么可信? 答案是证书链——信任逐级向上传递:
网站证书(叶子) ← 由「中间 CA」签名
↑ 验签用中间 CA 的公钥
中间 CA 证书 ← 由「根 CA」签名
↑ 验签用根 CA 的公钥
根 CA 证书(根) ← 自签名,且预置在操作系统/浏览器里,天然信任
浏览器从网站证书开始,一级级往上验签,直到遇到一个预置在本地信任库里的根证书。根证书是「信任的锚点」(trust anchor)——它不需要别人证明,因为它本来就在你系统里、由操作系统/浏览器厂商预先信任。整条链每一环都验签通过,才最终信任网站证书。
为什么要中间 CA 而不直接用根 CA 签?因为根 CA 的私钥极其重要,一旦泄露整个体系崩塌,所以根 CA 平时离线保管,用中间 CA 来日常签发,隔离风险。
四、验证不只看签名,还看这些
证书验签通过还不够,浏览器还会检查:
- 域名匹配:证书里的域名是否和你访问的域名一致(防止拿 a.com 的合法证书冒充 b.com);
- 有效期:是否在有效期内(过期会警告);
- 吊销状态:证书是否被吊销(通过 CRL 或 OCSP 查询,OCSP Stapling 可优化);
- 信任链完整:能否一路链到受信任的根。
任何一项不过,浏览器就显示「你的连接不是私密连接」的警告。
五、自签名证书为什么会被警告
你可以自己给自己签一张证书(自签名),但浏览器会报不安全警告。因为自签名证书没有经过受信任 CA 的背书——它自己证明自己,就像自己给自己发身份证,没有公信力。浏览器无法把它链到任何受信任的根证书,所以不信任。内网测试可以手动导入信任,但公网必须用受信 CA 签发的证书(如 Let’s Encrypt 免费证书)。
六、常见误区
- ❌ 以为证书是用来加密的——证书是身份背书(证明公钥归属),加密由密钥交换和对称加密完成。
- ❌ 以为浏览器直接信任网站证书——要沿证书链一级级验签到预置的根证书。
- ❌ 以为有证书就绝对安全——CA 被攻破、错误签发、或用户手动信任了恶意根证书,仍可能被冒充。
- ❌ 以为自签名证书不安全是因为加密弱——加密一样强,问题是没有可信第三方背书、无法链到受信根。
六、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 证书内容 | 域名、公钥、主体、有效期、签发者、签名 |
| 证书链 | 服务器证书到中间 CA 再到根 CA |
| 验证重点 | 签名、域名、有效期、用途、吊销状态 |
server cert --signed by--> intermediate CA
intermediate CA --signed by--> root CA
root CA trusted by OS/browser
证书解决的不是“加密算法强不强”,而是“这个公钥到底是不是目标网站的”。
- 误区:证书里保存服务器私钥。 证书里是公钥和身份信息,私钥必须只由服务器自己保存。
- 误区:浏览器只要能解开签名就信任证书。 还要校验证书链、域名匹配、有效期、用途和吊销状态等。
- 误区:自签名证书一定不能加密。 自签名也能加密传输,但浏览器不默认信任其身份背书。
- 追问:根 CA 为什么可信? 根证书预置在操作系统或浏览器信任库中,是信任链的锚点。
- 追问:中间 CA 有什么作用? 降低根 CA 直接签发风险,便于分级管理和吊销。
- 追问:域名不匹配会怎样? 浏览器会警告或阻止,因为证书不能证明当前访问域名的身份。
七、加强记忆
数字证书是 CA 用私钥签名、把「域名 + 服务器公钥」绑定的身份凭证,解决「公钥是否真属于该域名」的可信问题。浏览器用证书链逐级验签——网站证书 → 中间 CA → 根 CA(预置信任的锚点),并检查域名、有效期、吊销状态,全通过才信任。中间人没有 CA 私钥,伪造不出被信任的证书,冒充因此被挡住。