HTTPS 与 TLS 工作原理详解:握手过程揭秘
你输入一个网址,按下回车,一个锁形图标出现了。但浏览器和服务器之间到底发生了什么,才让这个连接变得安全?许多开发者把 HTTPS 当作一个黑盒——直到出问题,比如证书错误或性能问题。本文揭开 TLS(HTTPS 背后的协议)的面纱,用通俗的语言解释握手过程。
HTTPS 到底是什么
HTTPS 简单来说就是 HTTP 运行在 TLS(传输层安全协议)之上。TLS 提供三项保证:
- 机密性 – 数据被加密,窃听者无法读取。
- 完整性 – 数据在传输过程中被篡改会被发现。
- 身份验证 – 你连接的是真正的服务器,而不是冒充者。
没有 TLS,HTTP 以明文发送所有内容:密码、Cookie 和表单数据对网络路径上的任何人都可见。
通俗解释 TLS 握手
握手是在发送任何应用数据之前进行的协商。其目标是:商定加密算法、验证服务器身份、建立共享密钥。以下是 TLS 1.3(现代标准)的流程:
- Client Hello – 浏览器发送支持的密码套件列表、一个随机数以及它的密钥共享(用于密钥交换)。
- Server Hello – 服务器选择一个密码套件,发送自己的随机数和密钥共享,并提供证书链。
- 证书验证 – 浏览器对照受信任的根 CA 检查证书,验证域名,并检查有效期。
- 密钥派生 – 双方使用密钥交换(通常是 ECDHE)计算出相同的共享密钥。会话密钥由此派生。
- Finished – 双方对握手记录发送 MAC,以确认没有被篡改。
之后,加密的应用数据开始流动。在 TLS 1.3 中,握手需要一次往返(1-RTT),恢复会话可以实现 0-RTT。
TLS 1.2 与 TLS 1.3 对比
TLS 1.2 需要两次往返,并且支持较弱的算法。TLS 1.3 移除了过时的密码套件,简化了握手,并加密了更多握手过程本身。始终优先使用 TLS 1.3;大多数现代服务器和浏览器都支持它。
证书:信任锚点
证书将公钥与域名绑定,并由证书颁发机构(CA)签名。浏览器内置了受信任根 CA 的存储。在验证过程中,浏览器从服务器证书构建一条链,直到受信任的根。
常见的证书类型:
- DV(域名验证) – 证明对域名的控制权;快速且免费(例如 Let's Encrypt)。
- OV(组织验证) – 包含经过验证的公司详细信息。
- EV(扩展验证) – 更严格的身份检查;在大多数浏览器中不再显示绿色地址栏。
证书会过期。使用 Certbot 等 ACME 客户端自动续期,以避免服务中断。
密钥交换与完美前向保密
现代 TLS 使用临时密钥交换(ECDHE)。每次会话生成新的密钥对,因此即使服务器的私钥后来被泄露,过去的会话也无法解密。这一特性称为前向保密。避免使用静态 RSA 密钥交换,它缺乏这种保护。
常见的 HTTPS 陷阱及避免方法
- 混合内容 – 在 HTTPS 页面上加载 HTTP 资源会触发浏览器警告。使用相对 URL 或更新为 HTTPS。
- 证书过期 – 设置监控和自动续期。
- 弱密码套件 – 禁用 TLS 1.0/1.1 和 RC4/3DES。使用 SSL Labs 等工具进行测试。
- 缺少 HSTS – 添加
Strict-Transport-Security头以强制使用 HTTPS。
调试 TLS 问题
当握手失败时,使用 openssl s_client 检查连接:
openssl s_client -connect example.com:443 -servername example.com
这会显示证书链、协商的协议和密码套件。对于浏览器特定的错误,请检查开发者工具中的安全面板。
常见问题
HTTPS 和 TLS 是一回事吗?
HTTPS 是运行在 TLS 上的 HTTP。TLS 是加密协议;HTTPS 是 HTTP 应用协议的安全版本。
每个子域名都需要单独的证书吗?
不一定。通配符证书覆盖所有一级子域名,多域名(SAN)证书可以列出多个名称。
TLS 1.3 如何提升性能?
TLS 1.3 将握手减少到一次往返(恢复时为零次),并简化了密码协商,从而降低延迟。
准备好检查自己网站的安全性了吗?使用我们的 Nginx 日志分析器 来发现日志中可疑的 TLS 错误和握手失败。