SSL/TLS 证书详解:HTTPS 的工作原理

#SSL#TLS#HTTPS#安全#证书#Let's Encrypt#教程
5 min read

原文来源: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.devwww.samnet.devapi.samnet.dev

证书链

浏览器并不直接信任单个证书,而是信任一组根证书颁发机构。证书链的工作原理如下:

plaintext
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 天有效期 —— 短期证书更安全
  • 自动续订 —— 设置一次,长期无忧
bash
# 安装 certbot 并获取证书
apt install certbot python3-certbot-nginx
certbot --nginx -d samnet.dev -d www.samnet.dev
 
# 自动续期已默认配置
# 验证:
certbot renew --dry-run

Let's Encrypt 目前为超过 3 亿个网站提供安全保障。

常见 SSL 错误及解决方法

CERT_DATE_INVALID

证书已过期。解决方法:续订证书。

bash
certbot renew

ERR_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 预加载准备情况。

参见

Comments