HTTPS 和 TLS 到底如何工作:实用指南
你在浏览器中输入 https:// 并看到一个挂锁图标,但幕后究竟发生了什么?许多开发者将 HTTPS 视为一个复选框——启用后便不再理会。然而,理解 HTTPS 和 TLS 的真正工作原理对于调试连接问题、优化性能以及构建安全的应用程序至关重要。本指南通过实际示例逐步介绍 TLS 握手、证书验证和加密层,以便你能自信地回答诸如“我的网站为什么慢?”或“那个证书错误是什么意思?”等问题。
HTTPS 到底是什么
HTTPS 简单来说就是 HTTP 运行在 TLS(传输层安全协议)之上。TLS 提供三项保证:
- 机密性:数据被加密,窃听者无法读取。
- 完整性:数据在传输过程中无法被篡改而不被发现。
- 身份验证:你正在与真实的服务器通信,而非冒名顶替者。
没有 TLS,HTTP 以明文发送所有内容——密码、Cookie 和个人数据对网络上的任何人都可见。TLS 将 HTTP 消息包裹在加密隧道中,使第三方无法读取。
TLS 握手:分步详解
在任何 HTTP 数据流动之前,客户端和服务器会执行握手以协商加密参数并验证身份。以下是典型的 TLS 1.2 握手过程(TLS 1.3 简化了这一过程,我们稍后会看到):
- 客户端问候:客户端发送支持的密码套件列表、TLS 版本和一个随机值。
- 服务器问候:服务器选择一个密码套件和 TLS 版本,并发送自己的随机值。
- 证书:服务器发送其 TLS 证书(以及任何中间证书)以证明其身份。
- 密钥交换:客户端使用证书的公钥加密一个预主密钥并发送给服务器。双方派生出相同的会话密钥。
- 完成:双方发送握手消息的 MAC 以验证完整性,然后开始加密通信。
在 TLS 1.3 中,握手过程得到简化:客户端在第一条消息中发送密钥共享,服务器用自己的密钥共享和证书响应,将往返次数减少到仅一次。这显著加快了连接建立速度。
证书和信任链
TLS 证书将公钥与域名绑定,并由证书颁发机构(CA)签名。浏览器信任一组预装在操作系统或浏览器中的根 CA。当服务器出示其证书时,浏览器会验证:
- 证书由受信任的 CA 签名(直接或通过中间证书)。
- 域名与你访问的域名匹配。
- 证书在有效期内。
- 证书未被吊销(通过 OCSP 或 CRL)。
如果任何检查失败,你将看到警告。像 Let's Encrypt 这样的现代工具使获取免费、自动化的证书变得容易,因此没有理由不使用 HTTPS。
TLS 中的对称加密与非对称加密
TLS 巧妙地结合了两种加密类型:
- 非对称(公钥)加密 在握手期间用于安全地交换共享密钥。它的计算成本较高,但解决了密钥分发问题。
- 对称加密(例如 AES)使用该共享密钥加密实际数据。它对于批量数据来说快速且高效。
这种混合方法为你提供了公钥加密的安全性和对称密码的性能。
实际示例:检查 TLS 连接
你可以使用 openssl 查看握手过程。在终端中运行以下命令:
openssl s_client -connect example.com:443 -tls1_3
输出显示了密码套件、证书链和会话详细信息。查找类似 Protocol : TLSv1.3 和 Cipher : TLS_AES_256_GCM_SHA384 的行。这对于调试客户端无法连接的原因非常有价值——可能是客户端不支持服务器的密码套件或 TLS 版本。
常见的 TLS 陷阱及如何避免
- 证书过期:设置监控和自动续订(例如使用 Certbot)。
- 混合内容:在 HTTPS 页面上加载 HTTP 资源会破坏挂锁图标。使用相对 URL 或全站 HTTPS。
- 弱密码套件:禁用过时的协议(SSLv3、TLS 1.0/1.1)和弱密码(RC4、3DES)。使用 SSL Labs 等工具测试你的配置。
- 缺少中间证书:某些客户端需要完整的证书链。始终在服务器配置中包含中间证书。
如需快速检查,请通过在线 TLS 测试工具运行你的网站,或使用 openssl s_client -connect yourdomain.com:443 -showcerts 检查证书链。
TLS 1.3:新特性及其重要性
TLS 1.3(RFC 8446)带来了重大改进:
- 更快的握手:1-RTT(或恢复会话的 0-RTT)降低了延迟。
- 更强的安全性:移除了遗留算法并强制前向保密。
- 简化配置:可选择的密码套件更少。
大多数现代浏览器和服务器都支持 TLS 1.3。启用它可以同时提升性能和安全性。
常见问题
TLS 和 SSL 有什么区别?
SSL(安全套接层)是 TLS 的前身。由于安全缺陷,SSL 2.0 和 3.0 版本已被弃用。TLS 是现代、安全的协议,尽管人们仍然口语化地说“SSL 证书”。
HTTPS 如何影响 SEO 和性能?
像 Google 这样的搜索引擎将 HTTPS 作为排名信号。在性能方面,TLS 在握手期间会增加少量开销,但借助 TLS 1.3 和会话恢复,影响微乎其微。使用 HTTP/2 或 HTTP/3(需要 HTTPS)实际上可以提高速度。
我可以不使用证书而使用 HTTPS 吗?
不可以。证书是证明服务器身份和启用加密所必需的。你可以从 Let's Encrypt 获取免费证书,或使用自签名证书进行内部测试,但浏览器会向用户发出关于自签名证书的警告。
准备好测试你的 HTTPS 设置了吗?使用我们的 Nginx 日志分析器 来监控 TLS 握手错误并优化你的服务器配置。