HTTPS 证书曾经是每年几百美元的支出,Let’s Encrypt 把它变成了零成本+全自动。这背后是 ACME 协议(RFC 8555):CA 不再靠人工审核域名归属,而是让申请者当场「表演」对服务器的控制权。理解这个机制,续期失败时才知道往哪查。
ACME 如何验证「域名是你的」
申请证书的本质是向 CA 证明两件事:你持有域名的控制权,以及你持有证书私钥。ACME 用「挑战-应答」完成验证,主流有两种方式:
HTTP-01 挑战:Let’s Encrypt 给你一个随机 token,要求你的服务器在 http://<域名>/.well-known/acme-challenge/<token> 路径上返回指定内容。CA 从公网访问这个 URL,能拿到正确内容就证明你控制该域名指向的服务器。
DNS-01 挑战:要求你创建一个 _acme-challenge.<域名> 的 TXT 记录。能改 DNS 就证明控制权。它是申请通配符证书(*.example.com)的唯一方式,也适合服务器不暴露 80 端口的场景;缺点是需要 DNS 服务商 API 才能自动化。
用 Certbot 申请证书
Certbot 是 EFF 维护的 ACME 客户端,各大发行版均可安装。以 Debian/Ubuntu + Nginx 为例:
apt update && apt install -y certbot python3-certbot-nginx如果 80 端口已经由 Nginx 提供服务,最省事的方式是让 Certbot 直接改 Nginx 配置:
certbot --nginx -d example.com -d www.example.comCertbot 会依次完成:生成私钥 → 发起 HTTP-01 挑战 → 通过验证拿到证书 → 修改 Nginx 配置启用 443 监听和 HTTP 跳转 HTTPS → 输出证书存放路径。
证书与私钥位置(Debian/Ubuntu 默认):
/etc/letsencrypt/live/example.com/fullchain.pem # 证书(含中间证书链)/etc/letsencrypt/live/example.com/privkey.pem # 私钥申请成功后检查证书内容:
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -dates -subject输出里能看到有效期——Let’s Encrypt 证书只有 90 天,这是故意的:短周期倒逼自动化,私钥泄露后的暴露窗口也更短。
自动续期:装好就忘
Certbot 安装时会自动注册一个 systemd timer(或 cron 任务),每天跑两次续期检查。验证它存在且工作正常:
systemctl list-timers | grep certbot # 查看定时器certbot renew --dry-run # 演习一次续期流程--dry-run 是续期排错的第一件武器:它走完整的验证流程但不实际签发,能提前发现 80 端口不通、Nginx 配置变化导致的失败。续期默认在证书剩余 30 天内才实际执行,此前的调用只是空转。
续期成功后需要让服务加载新证书。用钩子把重载动作挂进去:
certbot renew --deploy-hook "systemctl reload nginx"或者写入 /etc/letsencrypt/renewal/example.com.conf 的 [renewalparams] 段:
deploy_hook = systemctl reload nginx续期失败的常见原因
按出现频率排序:
- 80 端口被封或跳转。HTTP-01 必须走 80 端口(不允许跟随跳转到 443 之外的端口)。安全组、防火墙、CDN 回源配置都可能挡住
/.well-known/acme-challenge/路径。 - 域名解析变化。迁移服务器后忘了改 A 记录,CA 请求打到了旧机器。
- IPv6 不一致。域名同时有 AAAA 记录,CA 优先走 IPv6,而服务器 v6 没监听或被防火墙拦截——
--dry-run报错里如果看到 IPv6 地址就是它。 - 速率限制。同一注册域名每周最多签发 50 张证书,测试环境反复申请容易触发,错误信息会明确提示 rate limit。
查看续期日志定位具体原因:
journalctl -u certbot.timer --since "7 days ago"less /var/log/letsencrypt/letsencrypt.log上线后的安全检查清单
证书装完不等于高枕无忧:
- 用
curl -vI https://example.com确认返回 200 且证书链完整(输出里能看到SSL certificate verify ok)。 - HTTP 是否 301 跳转到 HTTPS;跳转后有没有带上 HSTS 头(
Strict-Transport-Security),让浏览器以后直接走 HTTPS。 - 旧协议和弱套件是否关闭——Qualys SSL Labs 的在线检测(ssllabs.com/ssltest)能给出评分和具体弱点清单。
延伸阅读
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 17 天
部分内容可能已过时