原文来源:SSL/TLS Certificates Explained: How HTTPS Actually Works
当你在浏览器地址栏看到挂锁图标时,表示你的浏览器和服务器之间的连接已使用 TLS(传输层安全协议)加密。但这究竟意味着什么?浏览器如何验证它正在与真正的服务器通信,google.com 而不是攻击者?那些证书警告又代表什么?
本指南解释了整个系统——从 TLS 握手的工作原理到 Let's Encrypt 为何改变了互联网。
需要 VPS 吗? Vultr(免费额度)、DigitalOcean(200 美元免费额度)或 RackNerd(价格实惠的年度套餐)。
SSL 与 TLS — 有什么区别?
SSL(安全套接字层)是最初的协议,由网景公司在 20 世纪 90 年代创建。由于存在安全漏洞,它已于 2015 年被弃用。TLS(传输层安全协议)是它的继任者。
| 版本 | 地位 |
|---|---|
| SSL 2.0 | 已弃用(不安全) |
| SSL 3.0 | 已弃用(POODLE 漏洞) |
| TLS 1.0 | 已弃用 |
| TLS 1.1 | 已弃用 |
| TLS 1.2 | 应用广泛,依然安全 |
| TLS 1.3 | 目前标准,速度最快,安全性最高 |
大家出于习惯仍然会说"SSL 证书",但实际使用的协议是 TLS。当有人说"SSL"时,他们指的就是 TLS。
TLS 握手的工作原理
当你的浏览器连接到服务器时 https://samnet.dev,在交换任何数据之前会发生 TLS 握手:
1. 客户端 Hello — 你的浏览器向服务器发送一条消息,列出它支持的 TLS 版本和密码套件,以及一个随机数。
2. 服务器 Hello — 服务器从客户端列表中选择最佳的 TLS 版本和密码套件,发送自己的随机数,并发送其 SSL 证书。
3. 证书验证 — 你的浏览器会检查证书:
- 它是由可信的证书颁发机构(CA)颁发的吗?
- 证书上的域名是否正确?
- 它过期了吗?
- 已被撤销吗?
4. 密钥交换 — 证书的公钥用于验证服务器身份(证明其与声明的身份相符)。单独的 Diffie-Hellman 密钥交换过程会生成共享的对称密钥。在 TLS 1.3 中,证书仅用于身份验证,不再用于密钥交换。
5. 加密连接 — 双方现在拥有相同的对称密钥。所有后续通信都将使用此密钥进行加密。握手过程大约需要 1-2 次往返(TLS 1.3 只需 1 次)。
整个握手过程需要 50-150 毫秒。之后,浏览器和服务器之间传输的每个字节的数据都会被加密。
SSL 证书包含哪些内容?
SSL 证书是一种包含以下内容的数字文档:
- 主题:证书有效的域名
- 颁发机构:颁发该证书的证书颁发机构
- 公钥:用于 TLS 握手期间的密钥交换
- 有效期:不得早于和不得晚于指定日期
- 序列号:唯一标识符
- 签名:证书颁发机构 (CA) 的加密签名,证明其已颁发此证书
- SAN(主题备用名称):证书涵盖的其他域名
证书类型
按验证级别
| 类型 | 验证 | CA 检查哪些内容 | 成本 | 信任 |
|---|---|---|---|---|
| DV(域名验证) | 自动的 | 你控制该域名 | 免费至每年 10 美元 | 基本的 |
| OV(组织验证) | 手动的 | 企业身份验证已验证 | 每年 50-200 美元 | 中等的 |
| EV(扩展验证) | 彻底 | 法人实体,实际地址 | 每年 100-500 美元 | 最高 |
域名验证 (DV) 证书是目前最常用的证书。Let's Encrypt 提供免费的 DV 证书。它们可以证明你对域名拥有控制权,但无法透露你的身份信息。
OV 和 EV 证书都需要证书颁发机构 (CA) 验证你的企业身份。EV 证书过去会显示一个带有公司名称的绿色栏,但浏览器在 2019 年移除了该功能。无论证书类型如何,其安全性都相同——区别在于身份验证。
按覆盖范围
| 类型 | 覆盖范围 | 示例 |
|---|---|---|
| 单域名 | 一个域名 | samnet.dev |
| 通配符 | 域名 + 所有子域名 | *.samnet.dev |
| 多域名(SAN) | 多个特定域名 | samnet.dev、www.samnet.dev、api.samnet.dev |
证书链
浏览器并不直接信任单个证书,而是信任一组根证书颁发机构。证书链的工作原理如下:
Root CA(受浏览器/操作系统信任)
└── Intermediate CA(由 Root CA 签名)
└── 你的证书(由 Intermediate CA 签名)当你的服务器提供其证书时,它也会发送中间证书。你的浏览器会沿着证书链一直查找受信任的根证书颁发机构 (CA)。如果链中的任何环节缺失或无效,你就会收到证书错误。
常见配置错误:忘记在服务器配置中包含中间证书。浏览器拥有根 CA 证书,但由于缺少中间环节,无法验证证书链。有些浏览器会缓存中间证书并正常工作,而有些浏览器则会失败——这会导致"在我这里可以正常工作"的问题出现不一致的情况。
Let's Encrypt
Let's Encrypt 是一个免费的自动化证书颁发机构,它从根本上改变了网络。在 Let's Encrypt(2015 年推出)出现之前,SSL 证书每年需要花费 50-300 美元,并且需要手动设置。现在:
- 免费 DV 证书
- 自动化 ——
certbot处理签发和续期事宜 - 90 天有效期 —— 短期证书更安全
- 自动续订 —— 设置一次,长期无忧
# 安装 certbot 并获取证书
apt install certbot python3-certbot-nginx
certbot --nginx -d samnet.dev -d www.samnet.dev
# 自动续期已默认配置
# 验证:
certbot renew --dry-runLet's Encrypt 目前为超过 3 亿个网站提供安全保障。
常见 SSL 错误及解决方法
CERT_DATE_INVALID
证书已过期。解决方法:续订证书。
certbot renewERR_CERT_AUTHORITY_INVALID
证书是自签名证书或由不受信任的证书颁发机构颁发。解决方法:使用来自受信任的证书颁发机构(例如 Let's Encrypt)的证书。
ERR_CERT_COMMON_NAME_INVALID
域名与证书不匹配。你正在访问 www.samnet.dev,但证书仅对 samnet.dev 有效。解决方法:将 www 域名添加为 SAN,或使用通配符证书。
ERR_SSL_PROTOCOL_ERROR
服务器和浏览器无法就 TLS 版本达成一致。这通常意味着服务器配置了过时的 TLS 版本。解决方法:启用 TLS 1.2 和 1.3,禁用旧版本。
混合内容警告
页面通过 HTTPS 加载,但其中包含的资源(图像、脚本、CSS)却通过 HTTP 传输。解决方法:将所有资源 URL 更改为 HTTPS 或使用协议相对 URL。
测试你的 SSL 配置
配置正确的 SSL 设置应具备以下条件:
- 支持 TLS 1.2 和 TLS 1.3
- 使用强密码套件
- 请提供完整的证书链
- 已启用 HSTS 标头
- SSL 测试成绩达到 A 或 A+
- 没有混合内容
使用免费 SSL 服务器测试 来分析服务器的 TLS 配置、证书链、协议支持和密码套件——以 SSL Labs 为蓝本,并生成详细的报告。
你还可以使用 HTTPS 重定向测试器 来验证 HTTPS 重定向和 HSTS 预加载准备情况。