HTTPS 与 TLS 工作原理详解:实用指南

Security2026-11-05TryQuickToolBox

你已经在浏览器中无数次看到过那个小锁图标。但当你访问一个 HTTPS 网站时,实际发生了什么?你的浏览器如何知道它正在与真实的服务器通信,而不是一个冒名顶替者?为什么有些网站明明有证书却仍然显示警告?

在本指南中,我们将用通俗的语言分解 HTTPS 和 TLS,并提供实际示例和可操作的建议。无论你是开发者、系统管理员,还是仅仅对 Web 安全感到好奇,你都会对安全连接如何建立和维护有一个坚实的心理模型。

什么是 HTTPS 和 TLS?

HTTPS(超文本传输协议安全)简单来说就是 HTTP 分层在 TLS(传输层安全)之上。TLS 是一种加密协议,提供三项保证:

历史上,SSL(安全套接层)是 TLS 的前身。尽管这两个术语经常互换使用,但 SSL 已被弃用且不安全。现代系统使用 TLS 1.2 或 1.3。

TLS 握手:建立安全连接

在任何加密数据流动之前,客户端(浏览器)和服务器会执行握手以协商加密参数并交换密钥。具体步骤因 TLS 版本而异,但核心思想相似。

TLS 1.2 握手(简化版)

  1. 客户端问候: 客户端发送支持的 TLS 版本、密码套件和一个随机值。
  2. 服务器问候: 服务器选择一个 TLS 版本和密码套件,并发送自己的随机值以及证书。
  3. 证书验证: 客户端检查证书的有效性、过期时间和信任链。
  4. 密钥交换: 使用证书的公钥,客户端加密一个预主密钥并发送给服务器。双方推导出相同的会话密钥。
  5. 完成: 双方发送握手的 MAC 以验证完整性。加密通信开始。

TLS 1.3 握手(更快更安全)

TLS 1.3 减少了往返次数并移除了弱算法。握手可以在一轮往返(1-RTT)甚至零往返(0-RTT)内完成,对于恢复的会话。它还加密了更多的握手过程,提高了隐私性。

# 示例:使用 OpenSSL 检查 TLS 握手
openssl s_client -connect example.com:443 -tls1_3 -brief

此命令显示协商的协议、密码套件和证书详细信息。

证书与信任链

证书是将公钥绑定到身份(如域名)的数字文档。它们由证书颁发机构(CA)颁发,是 TLS 中身份验证的基石。

当你的浏览器连接到服务器时,它会验证:

如果任何检查失败,浏览器会显示警告。这就是为什么过期证书会破坏 HTTPS。

加密实战:对称与非对称

TLS 同时使用非对称和对称加密:

这种混合方法平衡了安全性和性能。

实施 HTTPS 的实用技巧

以下是在你自己的网站上正确使用 HTTPS 的方法:

  1. 使用信誉良好的 CA: Let's Encrypt 提供免费证书;商业 CA 提供扩展验证和支持。
  2. 仅启用 TLS 1.2 和 1.3: 禁用 SSLv3、TLS 1.0 和 TLS 1.1。
  3. 配置强密码套件: 优先使用 AEAD 密码,如 AES-GCM 和 ChaCha20-Poly1305。
  4. 实施 HSTS: Strict-Transport-Security 头强制浏览器在将来访问时使用 HTTPS。
  5. 将 HTTP 重定向到 HTTPS: 使用 301 重定向确保所有流量都被加密。
  6. 自动化续订: 证书会过期;使用 Certbot 等工具自动续订。
  7. 定期测试: 使用 SSL Labs 的 SSL 测试来评估你的配置。

常见陷阱及如何避免

陷阱后果解决方案
证书过期浏览器警告,失去信任自动化续订和监控
混合内容HTTPS 页面上的不安全元素通过 HTTPS 加载所有资源
启用了弱协议易受攻击禁用 TLS 1.0/1.1 和 SSL
缺少中间证书链不完整,某些客户端出错安装完整链

常见问题

HTTPS 和 TLS 有什么区别?

HTTPS 是 HTTP 的安全版本,而 TLS 是提供安全性的协议。HTTPS 使用 TLS 来加密 HTTP 流量。

本地开发需要证书吗?

对于本地开发,你可以使用自签名证书,但浏览器会显示警告。像 mkcert 这样的工具可以创建本地受信任的证书。

证书应该多久续订一次?

现代最佳实践是每 90 天续订一次(如 Let's Encrypt),甚至更频繁。自动化是避免过期的关键。

准备好将这些知识付诸实践了吗?如果你需要分析 Nginx 日志以发现 TLS 错误或握手失败,试试我们的 Nginx 日志分析器 来快速解析和可视化日志数据。