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撤销测试证书(可选)
2.2申请正式证书
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服务。如遇问题,请根据日志提示针对性排查。