在 Nginx 上为 domain.com 域名启用 HTTPS,并且利用 Cloudflare 的 DNS 功能来自动获取和续期 Let’s Encrypt 证书
整体思路
- 安装 Certbot 和 Cloudflare DNS 插件:在您的 Debian 服务器上安装必要的软件。
- 创建 Cloudflare API Token:生成一个有权限修改 DNS 记录的 API Token,并保存在服务器上。这是让 Certbot 能够自动添加/删除验证记录的关键。
- 运行 Certbot 获取证书:使用 DNS 验证方式,首次获取 SSL 证书。
- 配置 Nginx 使用新证书:修改您的 Nginx 配置文件,监听 443 端口,并加载证书文件。
- 配置 HTTP 到 HTTPS 的重定向:将所有 HTTP 请求强制跳转到 HTTPS。
- 验证自动续期:确保 Certbot 的自动续期任务已设置成功。
安装 Certbot 和 Cloudflare DNS 插件
# 更新软件包列表
sudo apt update
# 安装 Certbot、Nginx插件(可选但推荐)和 Cloudflare DNS 插件
sudo apt install certbot python3-certbot-nginx python3-certbot-dns-cloudflare
创建并配置 Cloudflare API Token
为了安全,我们不使用全局 API Key,而是创建一个权限受限的 API Token。
- 登录您的 Cloudflare 仪表盘。
- 点击右上角您的头像,选择 “My Profile” (我的个人资料)。
- 切换到左侧的 “API Tokens” (API 令牌) 标签页。
- 点击 “Create Token” (创建令牌)。
- 在 “API token templates” 中,找到 “Edit zone DNS” (编辑区域 DNS) 这一项,点击 “Use template” (使用模板)。
- 配置令牌:
- Token name (令牌名称): 可以自定义,例如 certbot.domain.com。
- Permissions (权限): 保持默认的 Zone - DNS - Edit。
- Zone Resources (区域资源):
- 选择 Include (包括)。
- 选择 Specific zone (特定区域)。
- 在下拉菜单中选择您的域名 domain.com。
- 点击 “Continue to summary” (继续以显示摘要),然后点击 “Create Token” (创建令牌)。
- 非常重要:Cloudflare 会显示生成的 API Token。立即复制并保存它,因为离开此页面后您将无法再次看到它。
现在,回到您的服务器上,创建一个安全的配置文件来存放这个 Token。
# 创建一个目录来存放 Cloudflare 配置文件(如果不存在)
sudo mkdir -p /etc/letsencrypt/
# 创建配置文件
sudo touch /etc/letsencrypt/cloudflare.ini
在打开的 cloudflare.ini 文件中,粘贴以下内容,并将 YOUR_CLOUDFLARE_API_TOKEN 替换为您刚刚复制的 Token:
# Cloudflare API token used by Certbot
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
设置严格的文件权限,确保只有 root 用户可以读取此文件,防止 Token 泄露:
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
运行 Certbot 获取证书
现在我们可以使用 DNS 验证方式来获取证书了。
单个二级域名:
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d w3.domain.com \
--email your-email@example.com \
--agree-tos \
--non-interactive \
--expand \
--cert-name w3.domain.com
通佩二级域名:
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d domain.com \
-d '*.domain.com' \
--email your-email@example.com \
--agree-tos \
--non-interactive \
--expand \
--cert-name domain.com
多个域名(通佩二级 / 单个三级):
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d domain.com \
-d '*.domain.com' \
-d 'w1.w2.domain.com' \
--email your-email@example.com \
--agree-tos \
--non-interactive \
--expand \
--cert-name domain.com
如果一切顺利,Certbot 会自动通过 Cloudflare API 创建一个 TXT 记录来验证您的域名所有权,验证成功后会删除该记录,并将证书保存在 /etc/letsencrypt/live/[domain.com]/
目录下。
您会看到类似以下的成功信息:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/[domain.com]/fullchain.pem
Key is saved at: /etc/letsencrypt/live/[domain.com]privkey.pem
修改 Nginx 配置以启用 HTTPS
balabala…
测试并重载 Nginx
# 测试语法
sudo nginx -t
如果看到以下内容,说明配置没有语法错误。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 重载 Nginx
sudo nginx -s reload
# or
sudo systemctl reload nginx
验证自动续期
Certbot 在安装时会自动创建一个 systemd timer 或 cron job 来每天检查证书是否需要续期(通常在到期前30天内会进行续期)。我们可以模拟一次续期来确保整个流程是通的。
sudo certbot renew --dry-run
–dry-run 标志表示这是一个测试,不会真的更新证书,但会完整地走一遍验证流程。如果这个命令成功执行,没有任何错误,就说明您的自动续期已经配置好了,它会使用相同的 Cloudflare 插件和凭据文件来完成续期,您无需再做任何操作。
您也可以查看 Certbot 的定时器状态:
sudo systemctl list-timers | grep certbot
您应该能看到类似 certbot.timer 的条目,表明定时任务已激活。