HTTPS / TLS 全过程原理
HTTPS 不是“HTTP 加一个证书”这么简单。HTTPS 的核心是 TLS:它要在不可信网络上同时解决四件事:
- 防窃听:别人抓包也看不懂内容。
- 防篡改:别人改了内容能被发现。
- 身份可信:客户端知道自己连的是正确服务器。
- 密钥协商:客户端和服务端能安全生成后续通信使用的会话密钥。
如果只知道“HTTPS 更安全”,遇到证书错误、抓包、网关 TLS 终止、双向认证、证书过期、私钥泄露时就会不知道该怎么排查。
学习目标
学完本章要能说清楚:
- HTTP 为什么不安全。
- TLS 为什么要同时使用证书、非对称能力和对称加密。
- 证书链、CA、域名校验分别解决什么。
- 一次 HTTPS 请求从 TCP 连接到业务数据传输的全过程。
- TLS 握手中会话密钥怎么来的。
- 为什么后续业务数据不用 RSA 直接加密。
- TLS 终止、双向 TLS、证书过期、证书不匹配怎么排查。
HTTP 为什么不安全
普通 HTTP 明文传输。
flowchart TD
A["客户端发送 HTTP 请求"] --> B["网络链路"]
B --> C["服务端"]
D["攻击者抓包"] -.-> B
D --> E["直接看到 URL、Header、Body"]风险:
| 风险 | 说明 |
|---|---|
| 窃听 | 登录态、Token、身份证号、报文内容被看到 |
| 篡改 | 响应内容或请求参数被中间人改掉 |
| 冒充 | 客户端不知道对面的服务器是不是真的 |
| 重放 | 攻击者拿到旧请求后重复发送 |
注意:HTTPS 能保护传输链路,但不自动解决所有业务安全问题。开放 API 仍然可能需要签名、防重放、权限和审计。
TLS 解决问题的总体思路
TLS 不直接用非对称加密传所有业务数据,因为非对称算法慢、加密长度有限。TLS 采用混合方案:
flowchart TD
A["证书体系"] --> B["证明服务端身份"]
C["密钥协商"] --> D["生成会话密钥"]
D --> E["对称加密传输业务数据"]
E --> F["完整性校验防篡改"]简单理解:
- 证书解决“你是谁”。
- 密钥协商解决“我们以后用哪把临时密钥说话”。
- 对称加密解决“业务数据高效保密传输”。
- 完整性校验解决“内容有没有被改”。
证书到底是什么
证书可以理解成 CA 给网站签发的“身份证”。
证书里通常包含:
| 内容 | 说明 |
|---|---|
| 域名 | 证书适用于哪些域名 |
| 公钥 | 服务端对应私钥的公钥 |
| 颁发者 | 哪个 CA 签发 |
| 有效期 | 起止时间 |
| 签名算法 | CA 用什么算法签名 |
| CA 签名 | 证明证书内容没被篡改 |
浏览器信任证书,不是因为证书自己说可信,而是因为它能沿着证书链追溯到操作系统或浏览器信任的根 CA。
flowchart TD
A["服务器证书 api.example.com"] --> B["中间 CA 证书"]
B --> C["根 CA 证书"]
C --> D["浏览器/操作系统信任根证书"]客户端如何验证证书
客户端收到证书后会检查:
- 证书是否过期。
- 证书域名是否匹配访问域名。
- 证书链是否能连到可信根 CA。
- CA 签名是否正确。
- 证书是否被吊销。
- 证书用途是否允许服务端认证。
flowchart TD
A["收到服务端证书"] --> B{"域名是否匹配?"}
B -->|"否"| C["证书错误"]
B -->|"是"| D{"是否过期?"}
D -->|"是"| C
D -->|"否"| E{"证书链是否可信?"}
E -->|"否"| C
E -->|"是"| F{"CA签名是否正确?"}
F -->|"否"| C
F -->|"是"| G["证书校验通过"]这解释了为什么:
- 访问 IP 可能证书不匹配,因为证书签给域名。
- 自签证书浏览器不信,因为没有可信 CA 背书。
- 证书过期后 HTTPS 会失败。
- 中间证书漏配也会导致部分客户端失败。
TLS 握手全过程
下面是简化版 TLS 1.2/1.3 思路。实际细节很多,但学习时先抓主线。
sequenceDiagram
participant C as Client
participant S as Server
C->>S: ClientHello 支持的TLS版本、随机数、加密套件
S->>C: ServerHello 选择版本和套件、随机数
S->>C: Certificate 服务端证书
C->>C: 校验证书链、域名、有效期
C->>S: 密钥协商材料
C->>C: 计算会话密钥
S->>S: 计算会话密钥
C->>S: Finished 握手校验
S->>C: Finished 握手校验
C->>S: 使用会话密钥加密HTTP请求
S->>C: 使用会话密钥加密HTTP响应重点不是背每个报文字段,而是理解:
- 握手阶段建立信任和协商密钥。
- 业务阶段使用会话密钥加密 HTTP 数据。
- 会话密钥是临时的,不是证书私钥。
- 证书私钥泄露会影响身份可信和部分密钥协商安全。
为什么后续业务数据用对称加密
非对称加密的问题:
- 计算慢。
- 加密数据长度有限。
- 不适合大流量业务数据。
对称加密的问题:
- 双方要先有同一把密钥。
- 密钥不能被攻击者知道。
TLS 把两者组合起来:握手阶段用证书和密钥协商安全地产生会话密钥,后续用对称加密高效传输。
TLS 终止是什么
很多生产系统不是应用服务自己处理 TLS,而是在 Nginx、Ingress、网关或负载均衡处终止 TLS。
flowchart TD
A["浏览器 HTTPS"] --> B["Nginx / Ingress 终止 TLS"]
B --> C["内部 HTTP 或 HTTPS"]
C --> D["后端应用"]TLS 终止表示:
- 客户端到网关是 HTTPS。
- 网关解密请求。
- 网关再把请求转发给后端。
风险和注意点:
- 网关到后端如果是 HTTP,内网链路需要可信。
- 后端拿到的 scheme 可能是 HTTP,要处理
X-Forwarded-Proto。 - 证书和私钥集中在网关,权限要严格控制。
- 多层代理下真实客户端 IP、协议头要正确透传。
双向 TLS
普通 HTTPS 主要是客户端验证服务端身份。双向 TLS 还要求服务端验证客户端证书。
flowchart TD
A["客户端验证服务端证书"] --> B["服务端身份可信"]
C["服务端验证客户端证书"] --> D["客户端身份可信"]
B --> E["建立双向可信通道"]
D --> E适合:
- 内部服务高安全调用。
- 银行、医疗、政务接口。
- 设备接入平台。
- 不希望只靠 appId/secret 的场景。
代价:
- 客户端证书发放和轮换复杂。
- 证书吊销和过期管理要求高。
- 调试成本比普通 HTTPS 高。
HTTPS 之后还要不要接口签名
要看场景。
HTTPS 保护的是传输链路。它能防止链路窃听和中间人篡改,但开放 API 仍然可能需要业务级签名:
| 问题 | HTTPS 是否解决 | 接口签名是否有帮助 |
|---|---|---|
| 传输中被窃听 | 是 | 不是主要目标 |
| 传输中被篡改 | 是 | 也能发现业务报文篡改 |
| 调用方身份识别 | 部分,取决于证书/认证 | 是 |
| 请求被业务层重放 | 不充分 | timestamp + nonce 有帮助 |
| 网关后内部链路审计 | 不一定 | 签名可做业务证据 |
所以医院开放接口常见组合是:HTTPS + appId + timestamp + nonce + 签名。
Java 客户端证书错误常见原因
| 错误 | 可能原因 |
|---|---|
PKIX path building failed | Java 信任库不信任证书链 |
No subject alternative names | 证书域名和访问域名不匹配 |
certificate expired | 证书过期 |
handshake_failure | TLS 版本或加密套件不兼容 |
bad_certificate | 双向 TLS 客户端证书不被信任 |
排查顺序:
- 用浏览器或
openssl s_client看证书链。 - 检查访问域名是否在证书 SAN 中。
- 检查证书有效期。
- 检查服务端是否漏配中间证书。
- 检查 Java 运行时信任库。
- 检查 TLS 版本和加密套件。
商业场景:医院接口 HTTPS 接入
医疗数据采集平台对接医院接口时,建议:
- 对公网或专线 HTTP 接口统一升级 HTTPS。
- 证书使用可信 CA,内部系统可使用企业 CA。
- 对高安全接口启用双向 TLS。
- 网关统一管理证书、协议版本和安全头。
- 应用层仍使用签名、防重放和审计。
- 证书过期前告警,避免接口中断。
常见坑
| 坑 | 后果 | 正确做法 |
|---|---|---|
| 自签证书直接生产使用 | 客户端不信任或被中间人替换 | 使用可信 CA 或企业 CA |
| 证书只签 IP 但用域名访问 | 域名校验失败 | SAN 包含真实访问域名 |
| 中间证书漏配 | 部分客户端握手失败 | 配完整证书链 |
| 私钥放代码仓库 | 私钥泄露 | 用 Secret/KMS/网关证书管理 |
| 以为 HTTPS 能防所有重放 | 业务旧请求仍可能被重复提交 | 接口层加 timestamp + nonce |
| 证书无过期监控 | 到期当天全站故障 | 证书到期监控和自动续期 |
面试标准回答
HTTPS 的安全核心是 TLS。TLS 握手阶段通过证书链验证服务端身份,并协商出临时会话密钥;后续 HTTP 业务数据用对称加密传输,因为对称加密性能高。证书由 CA 签发,客户端会校验证书链、域名、有效期和签名。HTTPS 解决传输链路的窃听和篡改,但开放 API 仍常常需要 appId、timestamp、nonce 和签名来做业务身份识别、防篡改和防重放。关联知识点
本章小结
HTTPS/TLS 的主线是:证书证明身份,握手协商会话密钥,对称加密传业务数据,完整性校验防篡改。证书、私钥、域名、信任链、TLS 版本和网关终止都是生产落地必须理解的部分。
