Https核心原理与流程
目录
HTTPS 并非一个新的协议,而是 HTTP 协议运行在 SSL/TLS 协议之上的安全通道。其核心本质是混合加密:利用非对称加密解决密钥交换问题,利用对称加密解决数据传输效率问题。
一、HTTPS 建立连接的详细流程(TLS 握手)
这个过程就像特工交接任务,目的是在不安全的网络中协商出一把只有双方知道的“会话密钥”。
- 客户端发起请求
- 动作:浏览器发送
Client Hello。 - 内容:支持的 TLS 版本、支持的加密套件列表、客户端随机数。
- 服务端响应
- 动作:服务器发送
Server Hello。 - 内容:确认使用的 TLS 版本和加密套件、服务端随机数、数字证书(包含服务器公钥、域名、有效期、CA 签名等)。
- 客户端验证证书
- 动作:浏览器对证书进行“体检”(详见第二部分)。
- 结果:验证通过后,提取证书中的服务器公钥。
- 密钥交换(关键步骤)
- 动作:浏览器生成第三个随机数,称为预主密钥。
- 加密:用服务器公钥加密“预主密钥”,发送给服务器。
- 解密:服务器用私钥解密,拿到“预主密钥”。
- 生成会话密钥
- 原理:此时,客户端和服务端手里都有了三个数:
客户端随机数+服务端随机数+预主密钥。 - 计算:双方利用相同的算法,独立计算出同一把会话密钥。
- 注意:这把钥匙从未在网络上传输过,极其安全。
- 握手结束与数据传输
- 验证:双方互发
Finished消息(用会话密钥加密),确认密钥一致且握手未被篡改。 - 传输:后续所有的 HTTP 数据(HTML、图片等)都使用会话密钥进行对称加密传输。
二、客户端如何校验证书合法性
浏览器内置了一套严格的“安检机制”,只有以下 5 项全部通过,才会信任该证书:
- 信任链验证
- 原理:浏览器操作系统或浏览器内部预装了“受信任的根证书颁发机构”列表(包含根 CA 的公钥)。
- 校验:浏览器利用根 CA 的公钥,验证服务器证书上的数字签名。如果签名有效,说明该证书是由可信机构签发的。
- 有效期检查
- 校验:对比系统当前时间与证书中的
Not Before和Not After字段。 - 目的:防止使用过期或尚未生效的证书。
- 域名一致性检查
- 校验:检查证书中的
Common Name或Subject Alternative Name字段。 - 目的:确保你访问的域名(如
www.example.com)与证书里登记的域名完全一致,防止“张冠李戴”。
- 吊销状态检查
- 校验:浏览器可能会通过 CRL 或 OCSP 协议查询证书是否被 CA 机构提前吊销(例如私钥泄露的情况)。
- 完整性校验
- 校验:确保证书内容在传输过程中未被黑客篡改。
三、公钥如何解密签名并进行比对
这是 HTTPS 信任机制的数学基石。通常我们认为“公钥加密,私钥解密”,但在数字签名中,逻辑反过来了:“私钥加密(签名),公钥解密(验签)”。
核心逻辑
- 私钥签名:只有持有私钥的人(CA 机构)才能生成这段加密数据。
- 公钥解密:既然公钥能解开,就证明这段数据一定是私钥持有者生成的(身份认证)。
详细比对步骤
- 服务端(CA 签发时)
- 提取:提取证书的明文信息(域名、公钥、有效期等)。
- 哈希:对明文信息进行哈希运算(如 SHA-256),生成摘要 A。
- 加密:用 CA 机构的私钥对“摘要 A”进行加密。这个加密后的结果就是数字签名。
- 客户端(浏览器校验时)
- 解密:浏览器利用本地信任的 CA 公钥,去解密证书上的“数字签名”,还原出摘要 A。
- 计算:浏览器对收到的证书明文信息,用同样的哈希算法重新计算,生成摘要 B。
- 比对:
- 如果 摘要 A == 摘要 B:
- 说明内容未被篡改(完整性)。
- 说明签名确实由 CA 私钥生成(真实性)。
- 如果两者不一致,浏览器会直接拦截并报错。
四、总结速查表
| 核心环节 | 关键动作 | 使用的密钥 | 目的 |
|---|---|---|---|
| 握手阶段 | 交换随机数、传输证书 | 明文/非对称加密 | 协商参数、验证身份 |
| 密钥交换 | 传输预主密钥 | 公钥加密,私钥解密 | 安全传递生成会话密钥的“种子” |
| 证书校验 | 验证签名 | CA 公钥解密签名 | 确认服务器身份真实、未被篡改 |
| 通信阶段 | 传输网页数据 | 会话密钥(对称加密) | 高效、安全地传输业务数据 |