1059 字
5 分钟
免费 HTTPS:Let's Encrypt 证书申请与 Certbot 自动续期

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 为例:

Terminal window
apt update && apt install -y certbot python3-certbot-nginx

如果 80 端口已经由 Nginx 提供服务,最省事的方式是让 Certbot 直接改 Nginx 配置:

Terminal window
certbot --nginx -d example.com -d www.example.com

Certbot 会依次完成:生成私钥 → 发起 HTTP-01 挑战 → 通过验证拿到证书 → 修改 Nginx 配置启用 443 监听和 HTTP 跳转 HTTPS → 输出证书存放路径。

证书与私钥位置(Debian/Ubuntu 默认):

/etc/letsencrypt/live/example.com/fullchain.pem # 证书(含中间证书链)
/etc/letsencrypt/live/example.com/privkey.pem # 私钥

申请成功后检查证书内容:

Terminal window
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -dates -subject

输出里能看到有效期——Let’s Encrypt 证书只有 90 天,这是故意的:短周期倒逼自动化,私钥泄露后的暴露窗口也更短。

自动续期:装好就忘#

Certbot 安装时会自动注册一个 systemd timer(或 cron 任务),每天跑两次续期检查。验证它存在且工作正常:

Terminal window
systemctl list-timers | grep certbot # 查看定时器
certbot renew --dry-run # 演习一次续期流程

--dry-run 是续期排错的第一件武器:它走完整的验证流程但不实际签发,能提前发现 80 端口不通、Nginx 配置变化导致的失败。续期默认在证书剩余 30 天内才实际执行,此前的调用只是空转。

续期成功后需要让服务加载新证书。用钩子把重载动作挂进去:

Terminal window
certbot renew --deploy-hook "systemctl reload nginx"

或者写入 /etc/letsencrypt/renewal/example.com.conf 的 [renewalparams] 段:

deploy_hook = systemctl reload nginx

续期失败的常见原因#

按出现频率排序:

  1. 80 端口被封或跳转。HTTP-01 必须走 80 端口(不允许跟随跳转到 443 之外的端口)。安全组、防火墙、CDN 回源配置都可能挡住 /.well-known/acme-challenge/ 路径。
  2. 域名解析变化。迁移服务器后忘了改 A 记录,CA 请求打到了旧机器。
  3. IPv6 不一致。域名同时有 AAAA 记录,CA 优先走 IPv6,而服务器 v6 没监听或被防火墙拦截——--dry-run 报错里如果看到 IPv6 地址就是它。
  4. 速率限制。同一注册域名每周最多签发 50 张证书,测试环境反复申请容易触发,错误信息会明确提示 rate limit。

查看续期日志定位具体原因:

Terminal window
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)能给出评分和具体弱点清单。

延伸阅读#

免费 HTTPS:Let's Encrypt 证书申请与 Certbot 自动续期
https://meow.us.kg/posts/letsencrypt-certbot-auto-renewal/
作者
もゆちゃん
发布于
2026-10-05
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取