证书与信任链
复习
- 公钥、私钥与数字签名:签名可验证消息来源
- 密钥交换:双方协商出共享的会话密钥
- DNS 的名字空间:域名由分层机构共同管理
TL;DR
- 你拿到的公钥,未必真的属于目标网站
- 证书把公钥与身份绑定,并由权威机构签名
- 浏览器信任一组根证书,形成信任链
- 信任逐级传递,根是信任的起点
正文
假设你访问一个网站,对方发来一个公钥。你凭什么相信,这个公钥真的是那个网站的,而不是某个冒充者塞给你的?
这就是证书要解决的问题。
把身份和公钥绑在一起
一份证书(certificate)大致包含:
- 这个公钥属于谁(域名、组织等身份信息)
- 公钥本身
- 一个由权威机构(CA,证书颁发机构)给出的数字签名
因为签名的存在,只要你能信任这个签名机构,就能相信“这份证书里的公钥,确实属于这个身份”。身份和公钥,被牢牢绑在了一起。
信任链:一级信任一级
可问题又来了:你怎么信任那个签名机构呢?
答案是信任链。证书体系是一层层的:
- 最顶层是根证书,它被预先内置在浏览器或操作系统里
- 根可以给中间证书签名
- 中间证书再给网站证书签名
验证时,浏览器顺着链条一路往上看:网站证书由中间证书签,中间证书由根证书签,而根证书是我本来就信任的。只要每一环的签名都成立,信任就从根一路传到了网站。
这很像现实里的担保:你信任某人,因为他被一个你信任的人担保,而那个人又被你信任的人担保……最终追溯到一开始就相信的那个源头。
根为什么可信
那么,根证书为什么可信?
答案很朴素:因为它是出厂时就预装在浏览器和系统里的,由厂商事先审核)。 它是整套体系的信任起点。这个起点并非“天然正确”,而是建立在对浏览器/系统厂商和审核流程的信任之上。
这也提醒我们:安全体系里总有一个必须被信任的起点,重要的是让这个起点尽量少、尽量可控、并且能被审计。 证书信任链,正是把这个起点压缩成了数量有限的根。
有了证书、密钥交换和对称加密这几块积木,就可以把它们组装成保护网页通信的 TLS 了。
思考题 1
为什么不能只拿到公钥,就相信它属于某个网站?
思考题 2
“信任链”是怎样把信任从根证书传递到网站证书的?
小结
知识点
- 证书把公钥与身份绑定,并由 CA 签名
- 证书链从根逐级签发到网站证书
- 浏览器内置并信任一组根证书
- 根证书是整个信任体系的起点
参考资料
- Wikipedia(zh):公开密钥认证:用证书把公钥与身份绑定
- Wikipedia(zh):证书颁发机构:签发和管理数字证书的机构
思考题答案(仅供参考)
思考题 1
因为公钥本身不携带可信的身份信息,任何人都可以声称某个公钥属于某网站。没有权威的签名背书,你无法判断这是真的站点还是冒充者,所以不能仅凭公钥就相信其归属。
思考题 2
网站证书由中间证书签发,中间证书又由根证书签发,而根证书是浏览器预先信任的。验证时只要每一环的签名都成立,信任就沿着这条链从根逐级传递到网站证书,于是网站的公钥与身份也就获得了信任。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪