概念与原理
目标:先建立正确的心智模型,理解 Certbot 在做什么、为什么证书只有 90 天、验证方式怎么选。
1. 几个名词
| 名词 | 说明 |
|---|---|
| TLS / SSL 证书 | 用于 HTTPS 的证书,证明"这个域名对应的公钥属于谁",由 CA 签名。 |
| CA(证书颁发机构) | 签发证书的机构。Let's Encrypt 是一个免费的公共 CA。 |
| Let's Encrypt | 由 ISRG 运营的免费、自动化 CA,证书有效期 90 天。 |
| ACME 协议 | 自动化证书管理协议,客户端用它向 CA 申请/续期/撤销证书。 |
| Certbot | EFF 维护的 ACME 客户端,也是 Let's Encrypt 官方推荐的客户端之一。 |
| ACME 挑战(challenge) | CA 用来验证"你确实控制这个域名"的手段(HTTP-01 / DNS-01 / TLS-ALPN-01)。 |
一句话:Certbot 用 ACME 协议向 Let's Encrypt 证明你拥有某个域名,然后领到并安装证书,再周期性地自动续期。
2. 为什么证书只有 90 天
Let's Encrypt 的证书有效期固定为 90 天。设计意图是:
- 缩短暴露窗口:私钥一旦泄露,最多 90 天即失效。
- 强制自动化:手动换证书太痛苦,逼着所有人用自动续期(
certbot renew+ 系统定时任务)。 - 缩短吊销列表(CRL/OCSP):过期即淘汰,减少吊销状态需要维护的量。
所以"装完就忘"是错误认知——续期自动化是部署的一部分,不是可选项。参见 续期与自动化。
3. 证书链与文件
一份签发的证书包含几个文件,Certbot 把它们放在 /etc/letsencrypt/live/<域名>/ 下:
| 文件 | 内容 | 用途 |
|---|---|---|
cert.pem | 你的域名证书(叶子证书) | 一般不直接用 |
chain.pem | 中间证书链 | 一般不直接用 |
fullchain.pem | cert.pem + chain.pem 拼接 | 配 Web 服务器用这个 |
privkey.pem | 私钥 | 配 Web 服务器用这个,务必保密 |
信任链:浏览器信任根证书 → 根签发中间证书 → 中间证书签发你的域名证书。把 fullchain.pem 交给 Web 服务器,客户端才能验证完整链路。
live/下的文件其实是符号链接,指向archive/里的真实文件。每次续期生成新版本,live/链接自动切换到最新,Web 服务器路径永远不变。详见 配置与文件布局。
4. 三种验证方式(challenge)对比
CA 在发证书前,必须确认你能控制这些域名。三种方式:
| 方式 | 原理 | 端口/记录 | 支持通配符 | 典型场景 |
|---|---|---|---|---|
| HTTP-01 | CA 请求 http://<域名>/.well-known/acme-challenge/<token>,你要能返回指定内容 | TCP 80 | ❌ | 有公网 80 端口、有 Web 服务 |
| DNS-01 | CA 让你在域名的 TXT 记录里写入 _acme-challenge.<域名> 的指定值 | DNS TXT | ✅ | 通配符证书、80/443 都不开放 |
| TLS-ALPN-01 | 在 443 端口用特殊 ALPN 协议响应 | TCP 443 | ❌ | 80 被占用但 443 空闲、无需停 Web 服务 |
选型经验:
- 有正常对外 Web 服务 →
HTTP-01(webroot 或 nginx/apache 插件)。 - 要 通配符
*.example.com→ 只能DNS-01。 - 域名 DNS 托管在 Cloudflare / 阿里云 / Route53 等 →
DNS-01+ 对应dns-*插件可全自动。 - 只想签证书、不装到 Web 服务器 →
certonly+ webroot/standalone/manual。
详见 插件与验证方式。
5. 一次完整签发流程
以 certbot certonly --webroot -w /var/www/html -d example.com 为例:
- 注册账号(首次):Certbot 用你的邮箱在 Let's Encrypt 生成一个 ACME 账户(账号密钥存在
/etc/letsencrypt/accounts/)。 - 发起订单:请求为
example.com签发证书。 - 创建挑战:CA 返回一个 token,Certbot 把 token 写到
/var/www/html/.well-known/acme-challenge/。 - CA 验证:CA 通过公网访问
http://example.com/.well-known/acme-challenge/<token>核对内容。 - 签发:验证通过后 CA 下发证书,Certbot 存入
archive/并在live/建链接。 - (可选)安装:
--nginx/--apache会再自动改配置、加载证书、可选加跳转/HSTS。 - 登记续期:生成
/etc/letsencrypt/renewal/example.com.conf,之后certbot renew按此配置自动续期。
6. 生产环境 vs 测试环境
- 生产 CA:
https://acme-v02.api.letsencrypt.org/directory(默认)。 - Staging 测试 CA:
https://acme-staging-v02.api.letsencrypt.org/directory,签的是不被浏览器信任的测试证书,但几乎不限速,适合反复调试。
调试方式二选一:
bash
# 方式 A:dry-run(走真实 CA 但只演练、不真正签发/写盘)
sudo certbot renew --dry-run
# 方式 B:staging(真签发,但签的是测试证书)
sudo certbot certonly --webroot -w /var/www/html -d example.com --test-cert先 dry-run,再正式跑,能避免触发限速(见 排错与最佳实践)。
