tls - https

10. TLS/HTTPS

0. 本章先解决什么问题

HTTP 本身可以表达请求和响应,但如果直接在明文网络上传输,会遇到三个根本问题:

别人能不能看到我传了什么?
别人能不能偷偷改我的数据?
我怎么知道对面真的是我要访问的站点?

TLS 解决的就是这些问题。HTTPS 可以理解为:

HTTP over TLS

也就是 HTTP 语义不变,但传输前先建立一条加密、完整性保护、带身份认证的安全通道。

本章要讲清楚:

  1. TLS 保护什么,不保护什么。
  2. 证书和 CA 为什么能解决身份认证。
  3. 握手过程中为什么同时需要非对称加密、密钥交换和对称加密。
  4. HTTPS 常见失败如何排查。

TLS 握手与证书链

这张图怎么读

这张图把 TLS 拆成两件事:先验证身份,再协商密钥。证书链回答“对面是不是这个域名对应的合法服务”,密钥交换回答“后续 HTTP 数据怎么用对称密钥高效保护”。

1. 明文网络的三个威胁

在没有 TLS 的情况下,中间任何能观察路径的人都可能:

威胁含义
窃听看到请求路径、Header、Body、响应内容
篡改修改请求或响应内容
冒充假装成目标服务与你通信

用一个简化路径表示:

明文路径上的中间观察者

如果没有加密和身份认证,中间观察者可能让客户端以为自己在和真实服务通信,实际却在和伪造节点通信。

TLS 的目标不是让网络不经过中间节点,而是让中间节点即使转发了流量,也不能轻易看懂、篡改或冒充。

2. TLS 的三个核心目标

目标解决的问题直觉
机密性防止内容被窃听只有通信双方能解密
完整性防止内容被篡改被改过会被检测出来
身份认证防止对方被冒充客户端确认服务身份

这三个目标缺一不可:

只有加密但无认证:
你可能和攻击者建立了加密通道

只有认证但无加密:
你知道对方是谁,但内容仍被看见

只有完整性但无机密性:
内容不能被改,但能被读

HTTPS 的安全感来自三者组合,而不是“加密”一个词。

反例:只有加密,没有身份认证,会发生什么

如果客户端只和“某个人”协商出加密密钥,但不验证对方是不是目标服务,中间人可以这样做:

Client <-> Attacker 建立一条加密连接
Attacker <-> Server 建立另一条加密连接

客户端和服务端都以为自己在安全通信,但攻击者在中间分别解密再加密。加密存在,身份错了,安全目标仍然失败。

这就是证书验证的意义:TLS 不只是让数据“看不懂”,还要让客户端确认“我正在和正确的域名对应的服务建立通道”。

3. 对称加密和非对称加密为什么都需要

对称加密:

同一个密钥用于加密和解密

优点是快,适合大量数据传输。问题是:通信前双方怎么安全地得到同一个密钥?

非对称加密:

公钥可以公开
私钥必须保密

它适合身份认证和密钥协商,但计算成本更高,不适合每个数据字节都用它处理。

所以 TLS 的基本策略是:

握手阶段:
用证书、签名、密钥交换确认身份并协商密钥

数据阶段:
用协商出的对称密钥高效加密传输

这是一种工程取舍:用非对称机制解决信任和密钥启动问题,用对称机制解决大规模数据加密性能问题。

4. 证书:服务器身份的可验证声明

服务器证书大致包含:

内容作用
域名证书属于哪些域名
公钥客户端后续验证或协商使用
有效期证书在哪段时间有效
签发者哪个 CA 签发
签名CA 对证书内容的签名

客户端验证证书时,会检查:

  1. 证书域名是否匹配当前访问域名。
  2. 证书是否在有效期内。
  3. 证书链是否能追溯到受信任根 CA。
  4. 证书签名是否有效。
  5. 证书是否被吊销或被策略拒绝。

如果这些检查失败,浏览器或客户端会提示证书错误。

5. CA 信任链

客户端不可能提前认识每一个网站,但它可以内置或配置一组受信任的根 CA。

证书链大致是:

Root CA
-> Intermediate CA
-> Server Certificate

客户端验证时:

服务器证书由中间 CA 签发
中间 CA 由根 CA 签发
根 CA 在客户端信任列表里

于是信任从根 CA 传递到服务器证书。

这也意味着 CA 体系是强信任边界。错误签发、私钥泄露、过期、链配置不完整,都会影响 HTTPS 安全和可用性。

6. TLS 握手的简化流程

以现代 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 访问失败”,可以按层拆:

  1. DNS 是否解析到正确入口。
  2. TCP 443 是否能连接。
  3. TLS 握手是否完成。
  4. 证书链、域名、有效期是否正确。
  5. SNI 是否让网关选择了正确证书。
  6. ALPN 是否协商到预期协议。
  7. HTTP 请求是否真正到达应用。
  8. 响应是否被代理、缓存或安全设备修改。

如果第 3 步失败,问题在 TLS 通道建立阶段;如果第 7 步以后才失败,才更可能是 HTTP 或应用语义问题。

这也是为什么排障时要区分:

TCP connect 成功
TLS handshake 成功
HTTP status 正常
应用返回正确

它们是不同层次的证据。

11. 学完本章你能解决什么问题

学完本章,你应该能:

  1. 解释 HTTPS 是 HTTP over TLS,而不是一种完全不同的应用语义。
  2. 区分 TLS 的机密性、完整性、身份认证三大目标。
  3. 说明为什么握手阶段用非对称机制,数据阶段用对称加密。
  4. 理解证书、CA、证书链、域名匹配和有效期的作用。
  5. 解释 SNI 和 ALPN 为什么会影响 HTTPS 入口行为。
  6. 排查证书过期、域名不匹配、证书链不完整、协议不兼容、握手超时等问题。
  7. 判断 HTTPS 失败发生在 DNS、TCP、TLS、HTTP 还是应用阶段。

延伸阅读