SSL 证书与 HTTPS
这页适合作为“自建站点 HTTPS 接入与续期手册”。真正要避免的不是申请证书本身,而是证书签到了、Nginx 配了、结果续期没跑通,几个月后网站突然掉证书。
Let's Encrypt + Certbot
Let's Encrypt 提供免费 SSL 证书,Certbot 是官方推荐的自动化工具。
推荐接入顺序
建议按下面顺序完成:
- 先确认域名解析到正确服务器
- 再确认 80 / 443 端口和 Nginx 配置基本正常
- 选择 HTTP 验证或 DNS 验证方案
- 签发成功后,立刻验证自动续期
- 最后再补 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
延伸阅读
参考链接
- Let's Encrypt — 免费证书
- Certbot 官网 — 安装指南
- SSL Labs 测试 — 检测 SSL 配置
- Mozilla SSL 配置生成器 — 最佳实践配置