深色模式
Let's Encrypt 证书
摘要:免费的 Let's Encrypt 证书是运维标配。本文用
certbot以 DNS 验证方式申请一张泛域名证书(适合不能暴露 80 端口的内网/多节点场景),并配置自动续期。
适用环境
bash
which certbot || sudo apt install certbot
certbot --version
# DNS 验证需要你能在该域名 DNS 解析处添加 TXT 记录1
2
3
2
3
操作步骤
1. 用 manual DNS 模式申请(通用、无需开放 80)
bash
sudo certbot certonly --manual --preferred-challenges dns \
-d example.com -d '*.example.com'1
2
2
按提示,在域名 DNS 里加一条 _acme-challenge.example.com 的 TXT 记录,值为工具给出的值,等生效后再回车继续。
2. 验证 TXT 已生效(另开终端)
bash
dig +short TXT _acme-challenge.example.com
# 看到工具给出的字符串再回车继续申请1
2
2
3. 证书落地位置
bash
sudo ls -l /etc/letsencrypt/live/example.com/
# fullchain.pem(证书链) privkey.pem(私钥)1
2
2
4. 部署到 Nginx(示例)
nginx
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;1
2
2
5. 配置自动续期
bash
sudo certbot renew --dry-run # 先试跑
# 正式续期由系统 timer 自动执行:
systemctl list-timers | grep certbot1
2
3
2
3
验证
bash
sudo openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -dates
# 看 Not Before / Not After,应为 90 天内有效
curl -svI https://example.com 2>&1 | grep -i "subject\|expire"1
2
3
2
3
证书有效期正确、浏览器/客户端访问无证书报错,即部署成功。
常见坑
WARNING
--manual 模式不会自动续期(因为要你手动加 TXT)。生产请用对应 DNS 服务商的 certbot 插件(如 certbot-dns-aliyun、certbot-dns-cloudflare),把 API 凭据交给插件即可全自动 renew。
DANGER
证书私钥 privkey.pem 权限应为 600 且仅 root 可读。切勿把私钥提交到代码仓库或打包进镜像层;泄露后应立即 certbot revoke 吊销并换新。