Nginx

在 Nginx 上为 domain.com 域名启用 HTTPS,并且利用 Cloudflare 的 DNS 功能来自动获取和续期 Let’s Encrypt 证书

整体思路

  1. 安装 Certbot 和 Cloudflare DNS 插件:在您的 Debian 服务器上安装必要的软件。
  2. 创建 Cloudflare API Token:生成一个有权限修改 DNS 记录的 API Token,并保存在服务器上。这是让 Certbot 能够自动添加/删除验证记录的关键。
  3. 运行 Certbot 获取证书:使用 DNS 验证方式,首次获取 SSL 证书。
  4. 配置 Nginx 使用新证书:修改您的 Nginx 配置文件,监听 443 端口,并加载证书文件。
  5. 配置 HTTP 到 HTTPS 的重定向:将所有 HTTP 请求强制跳转到 HTTPS。
  6. 验证自动续期:确保 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。

  1. 登录您的 Cloudflare 仪表盘。
  2. 点击右上角您的头像,选择 “My Profile” (我的个人资料)。
  3. 切换到左侧的 “API Tokens” (API 令牌) 标签页。
  4. 点击 “Create Token” (创建令牌)。
  5. 在 “API token templates” 中,找到 “Edit zone DNS” (编辑区域 DNS) 这一项,点击 “Use template” (使用模板)。
  6. 配置令牌:
    • Token name (令牌名称): 可以自定义,例如 certbot.domain.com。
    • Permissions (权限): 保持默认的 Zone - DNS - Edit。
    • Zone Resources (区域资源):
    • 选择 Include (包括)。
    • 选择 Specific zone (特定区域)。
    • 在下拉菜单中选择您的域名 domain.com。
  7. 点击 “Continue to summary” (继续以显示摘要),然后点击 “Create Token” (创建令牌)。
  8. 非常重要: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 的条目,表明定时任务已激活。

Copyright © 2025 LOLO