全部文章

SSL 证书与 HTTPS

Let's Encrypt 免费证书申请、Certbot 自动续期与 Cloudflare DNS 验证

目录 21 节

SSL 证书与 HTTPS

这页适合作为“自建站点 HTTPS 接入与续期手册”。真正要避免的不是申请证书本身,而是证书签到了、Nginx 配了、结果续期没跑通,几个月后网站突然掉证书。

Let's Encrypt + Certbot

Let's Encrypt 提供免费 SSL 证书,Certbot 是官方推荐的自动化工具。

推荐接入顺序

建议按下面顺序完成:

  1. 先确认域名解析到正确服务器
  2. 再确认 80 / 443 端口和 Nginx 配置基本正常
  3. 选择 HTTP 验证或 DNS 验证方案
  4. 签发成功后,立刻验证自动续期
  5. 最后再补 HSTS、OCSP、重定向等强化配置

安装 Certbot

# Ubuntu/Debian
apt install certbot python3-certbot-nginx -y

Nginx 自动配置

# 自动获取证书并配置 Nginx
certbot --nginx -d example.com -d www.example.com

# 测试续期
certbot renew --dry-run

Certbot 会自动修改 Nginx 配置并设置定时续期。

独立模式(无 Web 服务器)

certbot certonly --standalone -d example.com

手动 DNS 验证(通配符证书)

certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com

按提示添加 DNS TXT 记录后验证。

HTTP 验证还是 DNS 验证

可以这样选:

  • HTTP 验证:最适合普通单域名站点,配置简单
  • DNS 验证:适合通配符证书、内网服务、不能开放 80 端口的场景

如果你的 DNS 托管在 Cloudflare,优先考虑 DNS API 自动化,会比手工 TXT 记录轻松很多。

Cloudflare DNS 验证(自动化)

适合使用 Cloudflare 管理 DNS 的场景,无需开放 80 端口。

安装插件

apt install python3-certbot-dns-cloudflare -y

配置 API Token

创建 /etc/letsencrypt/cloudflare.ini

dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
chmod 600 /etc/letsencrypt/cloudflare.ini

申请证书

certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
  -d example.com \
  -d "*.example.com"

证书管理

# 查看已安装证书
certbot certificates

# 手动续期
certbot renew

# 删除证书
certbot delete --cert-name example.com

自动续期

Certbot 安装后会自动创建定时任务。验证:

systemctl list-timers | grep certbot

手动添加续期后重载 Nginx:

# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

续期检查清单

不要只看“今天签发成功了”,还要确认下面几件事:

  • certbot renew --dry-run 能通过
  • 定时器或 cron 任务已存在
  • 续期后会自动 reload Web 服务
  • 证书路径、权限和站点配置都引用了正确文件

Nginx SSL 最佳配置

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;

    # HSTS
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
}

常见问题

申请证书失败

优先检查:

  • 域名解析是否真的指向当前服务器
  • 80 端口是否被占用或被防火墙拦住
  • Nginx 配置是否能正常加载
  • Cloudflare 是否开了代理,影响了验证方式

证书明明签到了,但浏览器还是不安全

通常要继续排查:

  • 网站是否还混用了 HTTP 资源
  • 中间证书链是否完整
  • 访问的是否还是旧域名或旧站点配置
  • 反向代理层是否真正切到了新证书

自动续期没生效

这类问题最危险,因为平时看不出来。建议养成定期检查:

certbot renew --dry-run
certbot certificates
systemctl list-timers | grep certbot

延伸阅读

参考链接

阅读建议
  • - 先读标题和摘要,再结合目录决定从哪个章节开始精读。
  • - 看到具体命令、配置或步骤时,尽量在自己的环境里同步验证。
  • - 如果你只是快速查资料,可先看目录和相关文档,再决定是否深入全文。
适合谁看
  • - 希望把零散经验整理成长期可复用工作流的人
  • - 想先建立认知,再决定是否深入实践的人
  • - 希望阅读时顺手建立自己的操作清单或收藏体系的人
执行前检查
  • - 先浏览标题、摘要和目录,带着问题阅读会更高效
  • - 顺手记录真正对你有用的命令、链接和注意事项,避免重复搜索
  • - 如果页面里提到相关文档,尽量一起打开对照,效果通常更完整
同类内容
← 上一篇SSH 配置与使用