跳转至

CF与acme.sh

1、使用acme.sh申请SSL证书

1.1 安装acme.sh并配置Cloudflare API

curl https://get.acme.sh | sh -s email=[email protected]
source ~/.bashrc
export CF_Token="xxxxxxxx"
export CF_Account_ID="xxxxxxxx"
export CF_Zone_ID="xxxxxxxx"

1.2申请测试证书

acme.sh --issue --staging --dns dns_cf \
  -d yourdomain.com \
  -d *.yourdomain.com \
  --dnssleep 180 \
  --log
  • 检查DNS记录是否自动添加:登录Cloudflare控制台,确认TXT记录存在。

1.3手动验证证书信息

openssl x509 -in ~/.acme.sh/yourdomain.com_ecc/yourdomain.com.cer -text -noout | grep -E 'Issuer|DNS'

1.4安装测试证书到Nginx

sudo mkdir -p /var/www/yourdomain.com/ssl
sudo chmod 700 /var/www/yourdomain.com/ssl
acme.sh --install-cert --staging -d yourdomain.com \
  --key-file       /var/www/yourdomain.com/ssl/yourdomain.com.key \
  --fullchain-file /var/www/yourdomain.com/ssl/yourdomain.com.crt \
  --reloadcmd     "sudo systemctl reload nginx"
  • 设置严格的私钥权限:
sudo chown root:www-data /var/www/yourdomain.com/ssl/*
sudo chmod 640 /var/www/yourdomain.com/ssl/yourdomain.com.key

1.5配置证书自动更新

# 检查acme.sh的cron配置
sudo crontab -l | grep acme.sh

# 如果没有,添加自动更新任务
sudo crontab -e
# 添加以下行:
0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

# 验证自动更新配置
sudo systemctl status cron

2、切换到正式证书

2.1撤销测试证书(可选)

acme.sh --revoke -d yourdomain.com --staging
acme.sh --remove -d yourdomain.com --staging

2.2申请正式证书

acme.sh --issue --dns dns_cf \
  -d yourdomain.com \
  -d *.yourdomain.com \
  --dnssleep 180 \
  --force

2.3安装正式证书

acme.sh --install-cert -d yourdomain.com \
  --key-file       /var/www/yourdomain.com/ssl/yourdomain.com.key \
  --fullchain-file /var/www/yourdomain.com/ssl/yourdomain.com.crt \
  --reloadcmd     "sudo systemctl reload nginx"


常见问题解决

  • SSL证书不信任:确保证书链完整,ssl_certificate 应指向包含中间证书的fullchain文件。
  • 权限拒绝错误:检查Nginx用户(通常为www-data)是否有权读取证书和网站文件。
  • DNS解析失败:确认域名A记录指向服务器IP,且Cloudflare代理状态为DNS only(灰色云)。
  • 自动续期失败:检查acme.sh的cron任务是否存在:crontab -l

按照以上步骤操作后,您的Nginx应正确提供HTTPS服务。如遇问题,请根据日志提示针对性排查。