跳到主要内容

Debian 13 新服务器部署 acme.sh + Cloudflare 自动申请和续签证书

在 Debian 13 新服务器上部署 acme.sh,通过 Cloudflare DNS API 自动申请、安装和续签证书,并热重载 Nginx。

目标

本文适用于在一台新的 Debian 13 服务器上部署:

  • acme.sh
  • Cloudflare DNS API 验证
  • 自动申请证书
  • 自动续签证书
  • 自动把证书安装到指定目录,并自动热重载 Nginx 以加载新证书

目标证书路径:

/etc/nginx/cert/cert.pem
/etc/nginx/cert/private.key

示例域名:example.com 如果需要泛域名证书,申请内容为:

  • example.com
  • *.example.com

一、安装基础依赖

切换到 root:

sudo -i

更新系统并安装依赖:

apt update
apt install -y curl socat cron ca-certificates openssl nginx

(注:如果尚未安装 Nginx,上述命令会一并安装)

确保 cron 和 Nginx 正常运行:

systemctl enable --now cron nginx
systemctl status cron

二、安装 acme.sh

安装 acme.sh(请替换为你的真实邮箱):

curl https://get.acme.sh | sh -s email=admin@example.com

重新加载环境变量(使 acme.sh 命令生效):

source ~/.bashrc

检查版本:

acme.sh --version

开启 acme.sh 自动更新:

acme.sh --upgrade --auto-upgrade

设置默认 CA 为 Let’s Encrypt:

acme.sh --set-default-ca --server letsencrypt

三、Cloudflare 配置方式

你有两种选择:

  • 方式 A:新服务器重新设置 CF_Token
  • 方式 B:使用你原来备份的 account.conf

方式 A:新服务器重新设置 CF_Token

注意:获取的 Cloudflare API Token 必须包含 Zone.DNS - Edit 权限。

如果你想在新服务器重新配置,执行:

export CF_Token="你的_Cloudflare_API_Token"

如果你有 Account ID 也可以一起设置:

export CF_Token="你的_Cloudflare_API_Token"
export CF_Account_ID="你的_Cloudflare_Account_ID"
export CF_Zone_ID="你的_Cloudflare_Zone_ID"

申请证书时,acme.sh 会自动把这些变量保存到 /root/.acme.sh/account.conf。 为了安全,设置权限:

chmod 600 /root/.acme.sh/account.conf

方式 B:使用备份的 account.conf

如果你已经本地备份了旧服务器的 account.conf

  1. 确保 acme.sh 目录存在:按照“第二步”安装 acme.sh 后目录会自动生成。
  2. 上传文件:通过 scp 或 sftp 将本地的 account.conf 上传至新服务器的 /root/.acme.sh/account.conf
  3. 设置权限
chown root:root /root/.acme.sh/account.conf
chmod 600 /root/.acme.sh/account.conf
  1. 检查配置
grep CF_ /root/.acme.sh/account.conf

注:使用备份配置后,后面申请证书时通常不需要重新 export CF_Token。


四、申请证书

1. 单域名证书

acme.sh --issue --dns dns_cf -d example.com --keylength ec-256

2. 泛域名证书

如果你需要同时支持主域名和所有子域名(推荐增加 --dnssleep 给 DNS 解析生效留出时间):

acme.sh --issue --dns dns_cf \
  -d example.com \
  -d "*.example.com" \
  --keylength ec-256 \
  --dnssleep 120

五、安装证书到指定目录 (重要)

创建 Nginx 证书目录:

mkdir -p /etc/nginx/cert

安装证书并配置 Nginx 重载命令(使用 reload 可以平滑加载证书,不断开用户连接):

acme.sh --install-cert -d example.com --ecc \
  --fullchain-file /etc/nginx/cert/cert.pem \
  --key-file /etc/nginx/cert/private.key \
  --reloadcmd "systemctl reload nginx"

(注:如果你的申请命令中指定了 --keylength ec-256 或 acme.sh 默认签发了 ECC 证书,安装时加上 --ecc 参数以确保匹配正确类型的证书。)

设置权限(私钥严格保护):

chmod 644 /etc/nginx/cert/cert.pem
chmod 600 /etc/nginx/cert/private.key

检查证书有效期:

openssl x509 -in /etc/nginx/cert/cert.pem -noout -dates

六、确认 acme.sh 已记录安装路径和重载命令

执行:

acme.sh --info -d example.com

重点核对这些字段是否存在:

Le_RealFullChainPath='/etc/nginx/cert/cert.pem'
Le_RealKeyPath='/etc/nginx/cert/private.key'
Le_ReloadCmd='systemctl reload nginx'

只要有这些信息,后续自动续期成功后,acme.sh 就会自动替换文件并重载 Nginx 配置。


七、查看与修改自动续期任务

查看 cron 任务:

crontab -l

你可能会看到类似:

15 2 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

如果想修改检查时间(例如每天凌晨 04:30):

crontab -e

改为:

30 4 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

八、手动测试续期和自动复制

强制续期测试(验证 DNS 验证、文件拷贝和重载命令是否全部通畅):

acme.sh --renew -d example.com --force --ecc

强制续期后检查目标证书文件修改时间是否已更新:

ls -lah /etc/nginx/cert/