tls - https
10. TLS/HTTPS
0. 本章先解决什么问题
HTTP 本身可以表达请求和响应,但如果直接在明文网络上传输,会遇到三个根本问题:
别人能不能看到我传了什么?
别人能不能偷偷改我的数据?
我怎么知道对面真的是我要访问的站点?
TLS 解决的就是这些问题。HTTPS 可以理解为:
HTTP over TLS
也就是 HTTP 语义不变,但传输前先建立一条加密、完整性保护、带身份认证的安全通道。
本章要讲清楚:
- TLS 保护什么,不保护什么。
- 证书和 CA 为什么能解决身份认证。
- 握手过程中为什么同时需要非对称加密、密钥交换和对称加密。
- HTTPS 常见失败如何排查。
这张图怎么读
这张图把 TLS 拆成两件事:先验证身份,再协商密钥。证书链回答“对面是不是这个域名对应的合法服务”,密钥交换回答“后续 HTTP 数据怎么用对称密钥高效保护”。
1. 明文网络的三个威胁
在没有 TLS 的情况下,中间任何能观察路径的人都可能:
| 威胁 | 含义 |
|---|---|
| 窃听 | 看到请求路径、Header、Body、响应内容 |
| 篡改 | 修改请求或响应内容 |
| 冒充 | 假装成目标服务与你通信 |
用一个简化路径表示:
如果没有加密和身份认证,中间观察者可能让客户端以为自己在和真实服务通信,实际却在和伪造节点通信。
TLS 的目标不是让网络不经过中间节点,而是让中间节点即使转发了流量,也不能轻易看懂、篡改或冒充。
2. TLS 的三个核心目标
| 目标 | 解决的问题 | 直觉 |
|---|---|---|
| 机密性 | 防止内容被窃听 | 只有通信双方能解密 |
| 完整性 | 防止内容被篡改 | 被改过会被检测出来 |
| 身份认证 | 防止对方被冒充 | 客户端确认服务身份 |
这三个目标缺一不可:
只有加密但无认证:
你可能和攻击者建立了加密通道
只有认证但无加密:
你知道对方是谁,但内容仍被看见
只有完整性但无机密性:
内容不能被改,但能被读
HTTPS 的安全感来自三者组合,而不是“加密”一个词。
反例:只有加密,没有身份认证,会发生什么
如果客户端只和“某个人”协商出加密密钥,但不验证对方是不是目标服务,中间人可以这样做:
Client <-> Attacker 建立一条加密连接
Attacker <-> Server 建立另一条加密连接
客户端和服务端都以为自己在安全通信,但攻击者在中间分别解密再加密。加密存在,身份错了,安全目标仍然失败。
这就是证书验证的意义:TLS 不只是让数据“看不懂”,还要让客户端确认“我正在和正确的域名对应的服务建立通道”。
3. 对称加密和非对称加密为什么都需要
对称加密:
同一个密钥用于加密和解密
优点是快,适合大量数据传输。问题是:通信前双方怎么安全地得到同一个密钥?
非对称加密:
公钥可以公开
私钥必须保密
它适合身份认证和密钥协商,但计算成本更高,不适合每个数据字节都用它处理。
所以 TLS 的基本策略是:
握手阶段:
用证书、签名、密钥交换确认身份并协商密钥
数据阶段:
用协商出的对称密钥高效加密传输
这是一种工程取舍:用非对称机制解决信任和密钥启动问题,用对称机制解决大规模数据加密性能问题。
4. 证书:服务器身份的可验证声明
服务器证书大致包含:
| 内容 | 作用 |
|---|---|
| 域名 | 证书属于哪些域名 |
| 公钥 | 客户端后续验证或协商使用 |
| 有效期 | 证书在哪段时间有效 |
| 签发者 | 哪个 CA 签发 |
| 签名 | CA 对证书内容的签名 |
客户端验证证书时,会检查:
- 证书域名是否匹配当前访问域名。
- 证书是否在有效期内。
- 证书链是否能追溯到受信任根 CA。
- 证书签名是否有效。
- 证书是否被吊销或被策略拒绝。
如果这些检查失败,浏览器或客户端会提示证书错误。
5. CA 信任链
客户端不可能提前认识每一个网站,但它可以内置或配置一组受信任的根 CA。
证书链大致是:
Root CA
-> Intermediate CA
-> Server Certificate
客户端验证时:
服务器证书由中间 CA 签发
中间 CA 由根 CA 签发
根 CA 在客户端信任列表里
于是信任从根 CA 传递到服务器证书。
这也意味着 CA 体系是强信任边界。错误签发、私钥泄露、过期、链配置不完整,都会影响 HTTPS 安全和可用性。
6. TLS 握手的简化流程
以现代 TLS 思路简化理解:
握手里有几件事同时发生:
| 动作 | 目的 |
|---|---|
| 协商协议版本 | 双方选择都支持的 TLS 版本 |
| 协商加密套件 | 决定密钥交换、加密、完整性算法 |
| 服务器发证书 | 证明自己身份 |
| 密钥交换 | 双方生成共享密钥 |
| Finished 校验 | 确认握手没有被篡改 |
真实 TLS 细节很多,但初学最重要的是理解:握手不是传业务数据,而是在建立安全通道。
边界条件:TLS 成功不等于 HTTP 成功
一次 HTTPS 请求至少有三个成功边界:
| 边界 | 成功说明 | 仍然不能证明 |
|---|---|---|
| TCP connect 成功 | 能连到 443 入口 | 证书正确、TLS 能协商 |
| TLS handshake 成功 | 安全通道建立 | HTTP 路由、权限、业务成功 |
| HTTP status 成功 | 应用层返回成功状态 | 响应内容一定符合业务预期 |
所以排障时不要把这些句子混在一起:
端口通了
证书验证过了
接口成功了
它们是三层不同证据。TLS 失败时应用日志可能没有请求;HTTP 失败时 TLS 可能完全正常。
7. SNI 和 ALPN
同一个 IP 上可能部署多个 HTTPS 站点。服务器在握手早期需要知道客户端要访问哪个域名,才能选择正确证书。
SNI 的作用就是在 TLS 握手中携带目标域名:
ClientHello includes server_name = www.example.com
ALPN 用来协商应用层协议:
客户端支持: h2, http/1.1
服务端选择: h2
所以 HTTPS 不只是“443 端口 + 证书”。域名、证书、协议协商、网关配置都会影响最终行为。
8. HTTPS 保护什么,不保护什么
HTTPS 保护:
| 能保护 | 说明 |
|---|---|
| HTTP 请求/响应内容 | 路径、Header、Body 大多在加密通道内 |
| Cookie 等敏感 Header | 传输中不易被窃听 |
| 内容完整性 | 被篡改会被检测 |
| 服务身份 | 证书验证通过时可确认域名身份 |
HTTPS 不完全隐藏:
| 不完全隐藏 | 说明 |
|---|---|
| 目标 IP | 网络层仍需要路由 |
| 连接时间和数据量 | 流量元数据仍可观察 |
| DNS 查询 | 若 DNS 仍明文,域名解析可能可见 |
| 你访问了哪个组织的入口 | IP、SNI 等信息可能暴露部分线索 |
| 终端安全 | 客户端或服务端本身被攻破时,TLS 无法解决 |
TLS 是传输安全,不是万能安全。
9. 常见 HTTPS 失败
| 现象 | 可能原因 |
|---|---|
| 证书过期 | 证书有效期已过 |
| 域名不匹配 | 访问域名不在证书 SAN 列表里 |
| 证书链不完整 | 缺少中间证书 |
| 自签名不受信 | 客户端不信任签发者 |
| 协议版本不支持 | 客户端和服务端 TLS 版本无法协商 |
| 加密套件不兼容 | 双方没有共同算法 |
| 握手超时 | 网络、中间设备、服务负载问题 |
| SNI 配错 | 服务端返回了错误证书 |
| ALPN 协商异常 | HTTP/2/HTTP/1.1 选择不符合预期 |
HTTPS 错误往往发生在 HTTP 请求到达应用之前。此时服务应用日志未必能看到请求,因为安全通道还没建立成功。
排障卡:证书错误先拆五个检查点
证书错误不要只看“浏览器说不安全”。先把证书验证拆开:
| 检查点 | 要问什么 | 常见故障 |
|---|---|---|
| 域名匹配 | 当前访问域名是否在证书 SAN 里 | 用了错误证书、通配符范围不覆盖 |
| 有效期 | 证书是否过期或尚未生效 | 自动续期失败、机器时间错误 |
| 信任链 | 链能否连到客户端信任根 | 缺中间证书、自签名未导入信任 |
| 签名有效 | 证书内容是否被合法签发 | 链配置错、证书文件不匹配 |
| 吊销/策略 | 客户端策略是否拒绝它 | 旧算法、弱密钥、吊销状态异常 |
再把握手证据和 HTTP 证据分开:
TCP 443 能连接
只说明传输层入口可达
TLS 握手失败
HTTP 请求通常还没到应用
TLS 握手成功但 HTTP 失败
再继续查网关、路由、应用状态码和业务语义
这个拆法能避免一个常见误判:明明是 SNI/证书链问题,却一直去看应用日志。
10. 联系实际:HTTPS 排障不要只看应用
一个用户说“HTTPS 访问失败”,可以按层拆:
- DNS 是否解析到正确入口。
- TCP 443 是否能连接。
- TLS 握手是否完成。
- 证书链、域名、有效期是否正确。
- SNI 是否让网关选择了正确证书。
- ALPN 是否协商到预期协议。
- HTTP 请求是否真正到达应用。
- 响应是否被代理、缓存或安全设备修改。
如果第 3 步失败,问题在 TLS 通道建立阶段;如果第 7 步以后才失败,才更可能是 HTTP 或应用语义问题。
这也是为什么排障时要区分:
TCP connect 成功
TLS handshake 成功
HTTP status 正常
应用返回正确
它们是不同层次的证据。
11. 学完本章你能解决什么问题
学完本章,你应该能:
- 解释 HTTPS 是 HTTP over TLS,而不是一种完全不同的应用语义。
- 区分 TLS 的机密性、完整性、身份认证三大目标。
- 说明为什么握手阶段用非对称机制,数据阶段用对称加密。
- 理解证书、CA、证书链、域名匹配和有效期的作用。
- 解释 SNI 和 ALPN 为什么会影响 HTTPS 入口行为。
- 排查证书过期、域名不匹配、证书链不完整、协议不兼容、握手超时等问题。
- 判断 HTTPS 失败发生在 DNS、TCP、TLS、HTTP 还是应用阶段。