acme.sh + Cloudflare SSL 证书管理 🔐

🔐 自动化管理泛域名 SSL 证书,支持多级子域名安全加密
✨ 特点和功能
acme.sh 是一个强大且轻量的 ACME 协议客户端,具有以下特点:
- 🚀 完全自动化:支持证书自动申请、更新和部署
- 🔒 安全可靠:支持 ECC、RSA 多种密钥类型,集成 OCSP Stapling
- 🌐 多域名支持:支持泛域名证书和多域名 SAN 证书
- 📦 易于部署:一键安装,简单配置即可使用
- 🔄 持续维护:活跃的开源社区,定期更新和维护
- 🛡️ 零依赖:纯 Shell 编写,无需额外依赖环境
- 💡 多模式验证:支持 DNS、HTTP、TLS-ALPN 等多种验证方式
📖 目录导航
🚀 快速开始
🌟 一站式安装脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/bash
echo "开始安装 acme.sh..." curl https://get.acme.sh | sh -s email=meimolihan@live.com
echo "配置环境..." source ~/.bashrc alias acme.sh=~/.acme.sh/acme.sh
echo "设置默认 CA..." acme.sh --set-default-ca --server letsencrypt
echo "安装完成!版本信息:" acme.sh -v
|
📦 acme.sh 安装
🐧 安装方法
1 2 3 4 5 6 7 8 9 10
| curl https://get.acme.sh | sh -s email=meimolihan@live.com
curl https://gitcode.net/cert/cn-acme.sh/-/raw/master/install.sh?inline=false | sh -s email=meimolihan@live.com
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git cd acme.sh ./acme.sh --install -m meimolihan@live.com
|
🔧 安装后配置
1 2 3 4 5 6 7 8 9 10 11
| source ~/.bashrc
alias acme.sh=~/.acme.sh/acme.sh
acme.sh -v
acme.sh --upgrade --auto-upgrade
|
🎯 支持的证书颁发机构
1 2 3 4 5 6 7 8 9
| acme.sh --list-server
acme.sh --set-default-ca --server letsencrypt acme.sh --set-default-ca --server buypass acme.sh --set-default-ca --server zerossl acme.sh --set-default-ca --server ssl.com acme.sh --set-default-ca --server google
|
🔑 Cloudflare API 配置
🌐 获取 Cloudflare API Token
- 登录 Cloudflare: https://dash.cloudflare.com/
- 进入 API Tokens: 右上角用户图标 → My Profile → API Tokens
- 创建 Token:
- 使用模板 “Edit zone DNS”
- 权限: Zone - DNS - Edit
- 资源: Include - All zones (或指定域名)
- 保存 Token: 复制生成的 API Token

📝 配置环境变量
1 2 3 4 5 6 7 8 9
| export CF_Token="your_cloudflare_api_token_here"
export CF_Zone_ID="your_zone_id_here"
echo "CF_Token: $CF_Token" echo "CF_Zone_ID: $CF_Zone_ID"
|
🔒 安全配置建议
1 2 3 4 5 6 7 8 9
| mkdir -p ~/.acme.sh/conf cat > ~/.acme.sh/conf/cloudflare.env << EOF CF_Token="your_cloudflare_api_token_here" CF_Zone_ID="your_zone_id_here" EOF
chmod 600 ~/.acme.sh/conf/cloudflare.env
|
📝 证书申请
🎯 申请泛域名证书
1 2 3 4 5 6 7 8 9 10 11
| acme.sh --issue --dns dns_cf \ -d "mobufan.eu.org" \ -d "*.mobufan.eu.org" \ --keylength ec-256
acme.sh --issue --dns dns_cf \ -d "mobufan.eu.org" \ -d "*.mobufan.eu.org" \ --keylength 2048
|
📊 申请多个域名
1 2 3 4 5 6 7
| acme.sh --issue --dns dns_cf \ -d "example.com" \ -d "*.example.com" \ -d "test.org" \ -d "*.test.org" \ --keylength ec-256
|
🔍 调试模式
1 2 3 4 5 6 7 8 9 10 11
| acme.sh --issue --dns dns_cf \ -d "mobufan.eu.org" \ -d "*.mobufan.eu.org" \ --debug
acme.sh --issue --dns dns_cf \ -d "mobufan.eu.org" \ -d "*.mobufan.eu.org" \ --debug 2
|
📁 证书部署
🗂️ 创建证书目录
1 2 3 4 5 6 7
| sudo mkdir -p /etc/nginx/ssl sudo chmod 755 /etc/nginx/ssl
sudo mkdir -p /etc/ssl/private sudo chmod 700 /etc/ssl/private
|
📋 安装证书到 Nginx
1 2 3 4 5 6 7 8 9
| acme.sh --install-cert -d mobufan.eu.org \ --key-file /etc/nginx/ssl/key.pem \ --fullchain-file /etc/nginx/ssl/cert.pem \ --reloadcmd "systemctl reload nginx"
ls -la /etc/nginx/ssl/ openssl x509 -in /etc/nginx/ssl/cert.pem -noout -text
|
🔄 多服务部署
1 2 3 4 5 6 7 8 9 10
| acme.sh --install-cert -d mobufan.eu.org \ --key-file /etc/nginx/ssl/key.pem \ --fullchain-file /etc/nginx/ssl/cert.pem \ --reloadcmd "systemctl reload nginx"
acme.sh --install-cert -d mobufan.eu.org \ --key-file /etc/apache2/ssl/key.pem \ --fullchain-file /etc/apache2/ssl/cert.pem \ --reloadcmd "systemctl reload apache2"
|
📊 证书格式转换
1 2 3 4 5 6 7 8 9 10
| openssl pkcs12 -export \ -in /etc/nginx/ssl/cert.pem \ -inkey /etc/nginx/ssl/key.pem \ -out /etc/nginx/ssl/cert.p12 \ -passout pass:password
openssl x509 -in /etc/nginx/ssl/cert.pem \ -outform der -out /etc/nginx/ssl/cert.der
|
⚡ 自动维护
🕐 自动续签配置
1 2 3 4 5 6 7 8
| crontab -l
(crontab -l; echo '0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null') | crontab -
crontab -l | grep acme
|
📋 证书管理命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| acme.sh --list
acme.sh --info -d mobufan.eu.org
acme.sh --renew -d mobufan.eu.org --force
openssl x509 -in /etc/nginx/ssl/cert.pem -noout -dates
acme.sh --remove -d mobufan.eu.org acme.sh --revoke -d mobufan.eu.org
|
🔄 更新和维护
1 2 3 4 5 6 7 8 9 10 11
| acme.sh --upgrade
acme.sh --upgrade --auto-upgrade 0
acme.sh --upgrade --auto-upgrade 1
acme.sh --uninstall
|
🔧 故障排除
🐛 常见问题解决
1. DNS 验证失败
1 2 3 4 5 6 7 8 9 10
| dig TXT _acme-challenge.mobufan.eu.org
nslookup -type=TXT _acme-challenge.mobufan.eu.org
curl -X GET "https://api.cloudflare.com/client/v4/zones" \ -H "Authorization: Bearer $CF_Token" \ -H "Content-Type: application/json"
|
2. 权限问题
1 2 3 4 5 6 7
| sudo chmod 644 /etc/nginx/ssl/cert.pem sudo chmod 600 /etc/nginx/ssl/key.pem sudo chown root:root /etc/nginx/ssl/*.pem
chmod 700 ~/.acme.sh/
|
3. 续签失败
1 2 3 4 5 6 7 8
| acme.sh --renew -d mobufan.eu.org --force
acme.sh --renew -d mobufan.eu.org --debug
tail -f ~/.acme.sh/acme.sh.log
|
📊 监控和日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| tail -f ~/.acme.sh/acme.sh.log
acme.sh --list
openssl x509 -in /etc/nginx/ssl/cert.pem -noout -dates
EXPIRY_DAYS=$(openssl x509 -in /etc/nginx/ssl/cert.pem -checkend 864000 | grep -c "will expire") if [ $EXPIRY_DAYS -eq 1 ]; then echo "证书即将过期" | mail -s "证书告警" admin@example.com fi
|
💡 最佳实践
🛡️ 安全建议
1 2 3 4 5 6 7 8 9 10 11 12
| acme.sh --issue --dns dns_cf -d mobufan.eu.org --keylength ec-256
sudo tar -czvf /backup/ssl-certs-$(date +%Y%m%d).tar.gz /etc/nginx/ssl/ ~/.acme.sh/
sudo find /etc/nginx/ssl -type f -exec chmod 644 {} \; sudo find /etc/nginx/ssl -type f -name "*.pem" -exec chmod 600 {} \;
|
📈 性能优化
1 2 3 4 5 6 7 8
| sudo openssl ocsp -noverify \ -issuer /etc/nginx/ssl/chain.pem \ -cert /etc/nginx/ssl/cert.pem \ -url http://ocsp.int-x3.letsencrypt.org
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
|
🔄 自动化脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #!/bin/bash
DOMAIN="mobufan.eu.org" LOG_FILE="/var/log/acme-renew.log"
echo "$(date): 开始证书续签检查" >> $LOG_FILE
EXPIRY_DAYS=$(acme.sh --list | grep "$DOMAIN" | awk '{print $6}') if [ -z "$EXPIRY_DAYS" ] || [ "$EXPIRY_DAYS" -lt 5 ]; then echo "证书即将过期,执行续签..." >> $LOG_FILE acme.sh --renew -d $DOMAIN --force echo "证书续签完成" >> $LOG_FILE else echo "证书有效期剩余 ${EXPIRY_DAYS} 天,无需续签" >> $LOG_FILE fi
|
📝 Docker 使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| docker run --rm -it \ -v "/etc/ssl/acme":/acme.sh \ -e "CF_Token=your_token_here" \ -e "CF_Zone_ID=your_zone_id" \ neilpang/acme.sh \ --issue -d mobufan.eu.org --dns dns_cf
docker run --rm -it \ -v "/etc/ssl/acme":/acme.sh \ -e "CF_Token=your_token_here" \ -e "http_proxy=http://proxy:1080" \ -e "https_proxy=http://proxy:1080" \ neilpang/acme.sh \ --issue -d mobufan.eu.org --dns dns_cf --debug
|
🎯 提示: 建议在生产环境部署前充分测试所有配置。定期检查证书状态和日志,确保自动化流程正常运行。
📚 扩展资源:
🔧 紧急恢复:
1 2 3 4 5 6 7 8 9 10 11
| acme.sh --renew -d mobufan.eu.org --force --debug
sudo tar -xzvf /backup/ssl-certs-20231201.tar.gz -C /
acme.sh --install-cert -d mobufan.eu.org \ --key-file /etc/nginx/ssl/key.pem \ --fullchain-file /etc/nginx/ssl/cert.pem \ --reloadcmd "systemctl reload nginx"
|
acme.sh + Cloudflare SSL 证书管理 🔐