第 2 课,共 4 课 · 9 分钟
数字签名、证书与 TLS
浏览器怎么知道它真的在和你的银行通信,为什么一个挂锁图标意味着某种特定的东西,以及它不意味着什么。
上一课留下了一个悬而未决的问题:非对称加密让你能把一个秘密发送给一个你拿到了其公钥的人——但你怎么知道那把公钥真的属于他,而不是属于中间的某个攻击者?数字签名和证书正是用来回答这个问题的,而它们合在一起,让 TLS——每一个 https:// 地址背后的协议——成为可能。
数字签名:证明来源,而不是保密
数字签名把非对称加密反过来用。发送者不是用对方的公钥加密一条消息以便只有对方能读到它,而是用自己的私钥对消息进行签名,任何人都可以用发送者的公钥来验证这个签名。如果验证通过,就有两件事为真:这条消息确实来自持有那把私钥的人,并且之后没有被改动过——上一课讨论哈希时提到的那种抗碰撞性,正是让篡改能被察觉的原因。签名证明的是真实性和完整性;它本身并不能为消息保密。
证书:为一把公钥背书的签名
数字证书解决的是“这到底是谁的公钥”这个问题。正如 Cloudflare 学习中心所解释的,一份 SSL/TLS 证书是“托管在网站源服务器上的一个数据文件”,其中包含域名、公钥、到期日期,以及关键的一点——“证书颁发机构的数字签名”。证书颁发机构(CA)是一个受信任的第三方,它会核实某个网站确实控制着它申请证书所对应的域名,然后用自己的私钥为这份证书签名。你的浏览器内置了一份它信任的 CA 清单,所以当它收到一份由其中某个 CA 签名的证书时,它就可以信任其中的公钥,而完全不需要曾经与该网站的运营者打过交道。自签名证书——网站自己签发而不是从 CA 那里获得的证书——没有这种来自外部的背书,这也是浏览器默认不信任自签名证书的原因。
TLS:让两者协同发挥作用
RFC 8446,也就是 TLS 1.3 的规范文档,把握手过程描述为几个阶段:密钥交换,双方在这一阶段建立共享的秘密材料;然后是身份验证,用该 RFC 的话说,“通道的服务器一侧总是会被验证身份;客户端一侧则是可选的身份验证”——通常只有网站一方证明自己的身份,访问者并不需要。服务器用它的证书,以及只有它才能用私钥生成的签名,来证明自己是谁。一旦双方都信任了这条连接,它们就会派生出速度更快的对称密钥(通常就是上一课讲到的 AES),用于实际数据的传输。RFC 8446 直白地说明了这带来了什么:交换数据的机密性与完整性,以及对服务器的身份验证。它同样直白地指出了一个限度:“TLS 不隐藏它所传输数据的长度”,而诸如你连接到了哪个服务器、以及在什么时间连接这样的元数据,对任何能观察到这条连接的人来说仍然是可见的。
挂锁图标意味着什么,又不意味着什么
| 挂锁 / https:// 意味着 | 它不意味着 |
|---|---|
| 与该服务器的连接已加密,其完整性受到保护 | 这个网站是可信、诚实或使用起来安全的 |
| 你正在与掌控该域名的人通信 | 这个域名就是你以为的那个——一个足以以假乱真的仿冒域名同样能拿到有效证书 |
| 网络路径上没有人能读取或悄悄篡改这些流量 | 没有人能看到你访问了这个网站、什么时候访问的,或者访问了多少次 |
一个建立在仿冒域名上的钓鱼网站,完全可能拥有一份合法有效的证书:TLS 验证的是域名,而不是注册这个域名的人的意图。这也是为什么本大学前面讲“攻击是如何展开的”那一课,把一个带着挂锁图标的假登录页面当作真实存在的威胁,而不是一种自相矛盾的说法。
要点
- 一个数字签名证明了谁发送了一条消息,以及它没有被改动过——它本身并不能为消息保密。
- 一份证书是一份来自浏览器已经信任的证书颁发机构的、已签名的声明,证明某把公钥属于某个域名。
- TLS 握手(RFC 8446)总是会验证服务器的身份;访问者本人通常不会以同样的方式被验证。
- TLS 保护传输过程中的机密性与完整性,并确认你到达了你想要访问的域名——它不会隐藏一次连接是否发生过,也不保证连接背后的网站是可信的。
- 一个建立在仿冒域名上的钓鱼网站可以显示出一个完全有效的挂锁图标;证书验证的是域名,而不是运营者的意图。
自我检测
1. 一条消息上有效的数字签名能证明什么?
- 这条消息除了收件人之外对所有人都是保密的
- 这条消息来自某把特定私钥的持有者,并且没有被改动过 — 正确。
- 这条消息是通过 TLS 发送的
- 这条消息不含任何有害内容
签名利用签名者的密钥对来验证真实性和完整性;它们并不为消息加密以实现保密。
2. 证书颁发机构(CA)在 TLS 中扮演什么角色?
- 它替你存储密码
- 它用自己的签名为“某把公钥属于某个域名”这件事背书 — 正确。
- 它加密互联网上的所有流量
- 它自动屏蔽钓鱼网站
CA 核实域名控制权并为证书签名,让那些已经信任该 CA 的浏览器可以信任证书中的公钥,而无需直接联系网站运营者。
3. 根据 RFC 8446,一次典型的 TLS 连接中,哪一方总是会被验证身份?
- 只有客户端(你的浏览器)
- 服务器 — 正确。
- 默认情况下双方都不会
- 双方总是都会,没有例外
RFC 8446 规定服务器一侧总是会被验证身份,而客户端的身份验证是可选的,在普通的网页浏览中也远没有那么常见。
4. 为什么一个钓鱼网站仍然可能显示出一个有效的挂锁图标?
- 挂锁图标只是装饰性的,没有任何意义
- 证书验证的是一个域名,而不是注册它的人是否诚实 — 正确。
- 浏览器不再检查证书
- 钓鱼网站完全无法使用 HTTPS
TLS 证书确认的是你正在和某个域名的实际持有者通信;一个足以以假乱真的仿冒域名同样能获得一份完全有效的证书。
用 FireAI 动手做
在你自己的 Mac 上练习这节课的内容。
来源
- RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3
- Cloudflare Learning Center: What is an SSL certificate?
在你的 Mac 上实践
免费试用全部功能 17 天,无需绑定银行卡。