目标
本文适用于在一台新的 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:
- 确保 acme.sh 目录存在:按照“第二步”安装 acme.sh 后目录会自动生成。
- 上传文件:通过 scp 或 sftp 将本地的
account.conf上传至新服务器的/root/.acme.sh/account.conf。 - 设置权限:
chown root:root /root/.acme.sh/account.conf
chmod 600 /root/.acme.sh/account.conf
- 检查配置:
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/