这是一个基于 acme.sh 和 CertCloud 的免费 SSL 证书自动生成和维护脚本,支持多种 DNS 服务商和 Web 服务器的自动化证书管理。
基于 CertCloud 文档开发 本项目基于 CertCloud ACME 文档 开发,提供完整的 SSL 证书管理解决方案。
- 🎯 配置向导 - 交互式配置向导,快速完成初始设置
- 🚀 一键安装 - 自动安装和配置 acme.sh
- 🏢 CertCloud 集成 - 默认使用 CertCloud ACME 服务器,支持 EAB 认证
- 🔐 多种验证方式 - 支持 DNS 验证和文件验证
- 🌐 多DNS服务商 - 支持腾讯云、阿里云、DNSPod、AWS Route53、Cloudflare 等
- 🔄 自动续期 - 自动检测和续期即将过期的证书
- 📦 证书管理 - 完整的证书生命周期管理
- 🛡️ 安全配置 - 提供安全的 SSL 配置模板
- 📊 状态监控 - 实时监控证书状态和到期时间
- 💾 备份恢复 - 支持证书备份和恢复功能
- 🖥️ Web服务器集成 - 自动配置 Nginx 和 Apache
- 📢 通知系统 - 支持邮件和钉钉通知
- 🔧 完整工具链 - 单个脚本包含所有功能,无需额外安装脚本
- Linux (Ubuntu, CentOS, Debian, RHEL, Fedora)
- macOS
- FreeBSD
- Windows (Git Bash/WSL,功能受限)
- Bash 4.0+
- curl 或 wget
- git
- openssl (可选,用于证书信息查看)
ssl-acme-manager/
├── ssl_acme.sh # 主脚本 - 包含所有 SSL 证书管理功能
├── setup_config.sh # 配置向导 - 交互式配置生成器
├── ssl_acme.conf.example # 配置文件模板
├── examples.sh # 使用示例脚本
├── README.md # 项目文档
└── LICENSE # 许可证文件
-
ssl_acme.sh - 主要脚本,包含完整的 SSL 证书管理功能:
- acme.sh 安装和配置
- CertCloud ACME 账户注册
- 证书申请、安装、续期
- 证书状态监控和管理
- Web 服务器配置生成
- 证书备份和恢复
-
setup_config.sh - 配置向导,帮助快速生成配置文件
-
examples.sh - 使用示例,包含各种使用场景的命令示例
一个脚本搞定所有事情!
ssl_acme.sh包含了完整的 SSL 证书管理功能,从 acme.sh 安装到证书管理,一个脚本全搞定!
# 1. 下载脚本和配置文件
git clone https://github.com/your-repo/ssl-acme-manager.git
cd ssl-acme-manager
# 2. 添加执行权限
chmod +x ssl_acme.sh setup_config.sh
# 3. 运行配置向导
./setup_config.sh
# 4. 一键安装 acme.sh(使用配置向导生成的配置)
./ssl_acme.sh install
# 5. 注册 CertCloud 账户
./ssl_acme.sh register
# 6. 申请证书
./ssl_acme.sh issue -d example.com
# 7. 安装证书到 Nginx
./ssl_acme.sh install-cert -d example.com -t nginx配置向导将引导您完成以下设置:
- 📧 邮箱地址配置
- 🌐 ACME 服务器选择(CertCloud、Let's Encrypt、ZeroSSL)
- 🔧 DNS 服务商配置(DNSPod、腾讯云、阿里云、AWS、Cloudflare)
- 📁 证书存储路径设置
- 🔄 自动续期配置
- 🖥️ Web 服务器配置(Nginx、Apache)
- 📢 通知配置(邮件、钉钉)
# 1. 下载脚本和配置文件
git clone https://github.com/your-repo/ssl-acme-manager.git
cd ssl-acme-manager
# 2. 添加执行权限
chmod +x ssl_acme.sh
# 3. 复制配置文件模板
sudo cp ssl_acme.conf.example /etc/ssl_acme.conf
# 4. 编辑配置文件,设置默认邮箱和DNS服务商
sudo nano /etc/ssl_acme.conf# 基本配置
DEFAULT_SERVER="https://acme.trustasia.com/v2/DV90/directory"
DEFAULT_EMAIL="[email protected]"
DEFAULT_DNS_PROVIDER="dns_dp"
# 路径配置
CERT_BASE_PATH="/etc/ssl/certs"
KEY_BASE_PATH="/etc/ssl/private"
BACKUP_DIR="/var/backups/ssl_certificates"
ACME_HOME="$HOME/.acme.sh"
# 自动续期配置
AUTO_RENEW_DAYS=30
RENEW_CRON="0 2 * * *"
# DNS 服务商配置
DNSPOD_ID="your_dnspod_id"
DNSPOD_KEY="your_dnspod_key"# 使用配置向导后,直接运行(会使用配置文件中的默认邮箱)
./ssl_acme.sh install
# 或者手动指定邮箱
./ssl_acme.sh install -e [email protected]# 使用默认配置注册(推荐)
./ssl_acme.sh register
# 或者手动指定参数
./ssl_acme.sh register -e [email protected]# 使用默认 DNS 服务商申请证书
./ssl_acme.sh issue -d example.com
# 指定 DNS 服务商
./ssl_acme.sh issue -d example.com -p dns_dp
./ssl_acme.sh issue -d example.com -p dns_tencent
./ssl_acme.sh issue -d example.com -p dns_ali
# 使用文件验证申请证书
./ssl_acme.sh issue -d example.com -w /var/www/html# 安装到 Nginx(使用配置文件中的路径)
./ssl_acme.sh install-cert -d example.com -t nginx
# 安装到 Apache
./ssl_acme.sh install-cert -d example.com -t apache
# 自定义路径安装(注意:现在使用 .crt 后缀)
./ssl_acme.sh install-cert -d example.com \
--cert-path /etc/ssl/certs/example.com.crt \
--key-path /etc/ssl/private/example.com.key \
--reload-cmd "systemctl reload nginx"# 手动测试自动续期
./ssl_acme.sh auto-renew
# 添加到 crontab,每天凌晨2点检查并自动续期即将过期的证书
echo "0 2 * * * /path/to/ssl_acme.sh auto-renew" | sudo crontab -# 申请多个域名的证书
domains=("example1.com" "example2.com" "example3.com")
for domain in "${domains[@]}"; do
echo "处理域名: $domain"
./ssl_acme.sh issue -d "$domain" -p dns_dp
./ssl_acme.sh install-cert -d "$domain" -t nginx
done| 命令 | 说明 | 示例 |
|---|---|---|
install |
安装 acme.sh | ./ssl_acme.sh install -e [email protected] |
register |
注册 ACME 账户 | ./ssl_acme.sh register -e [email protected] |
issue |
申请 SSL 证书 | ./ssl_acme.sh issue -d example.com -p dns_dp |
install-cert |
安装证书到服务器 | ./ssl_acme.sh install-cert -d example.com -t nginx |
renew |
手动续期证书 | ./ssl_acme.sh renew -d example.com |
list |
列出所有证书 | ./ssl_acme.sh list |
remove |
删除证书 | ./ssl_acme.sh remove -d example.com |
status |
查看证书状态 | ./ssl_acme.sh status -d example.com |
backup |
备份证书 | ./ssl_acme.sh backup |
restore |
恢复证书 | ./ssl_acme.sh restore --backup-file /path/to/backup.tar.gz |
check-expiry |
检查证书到期时间 | ./ssl_acme.sh check-expiry --days 30 |
auto-renew |
自动续期即将过期的证书 | ./ssl_acme.sh auto-renew --days 30 |
nginx-config |
生成 Nginx 配置 | ./ssl_acme.sh nginx-config -d example.com |
apache-config |
生成 Apache 配置 | ./ssl_acme.sh apache-config -d example.com |
| 参数 | 说明 | 示例 |
|---|---|---|
-d, --domain |
指定域名 | -d example.com |
-w, --webroot |
网站根目录(文件验证) | -w /var/www/html |
-s, --server |
ACME 服务器地址 | -s https://acme.trustasia.com/v2/DV90/directory |
-e, --email |
邮箱地址 | -e [email protected] |
-p, --provider |
DNS 服务商 | -p dns_dp |
-t, --type |
Web 服务器类型 | -t nginx |
--cert-path |
证书文件路径 | --cert-path /etc/ssl/certs/example.com.crt |
--key-path |
私钥文件路径 | --key-path /etc/ssl/private/example.com.key |
--reload-cmd |
重载命令 | --reload-cmd "nginx -s reload" |
--days |
天数阈值 | --days 30 |
-f, --force |
强制执行 | -f |
-v, --verbose |
详细输出 | -v |
| 服务商 | 参数值 | 环境变量 |
|---|---|---|
| DNSPod | dns_dp |
DP_Id, DP_Key |
| 腾讯云 | dns_tencent |
Tencent_SecretId, Tencent_SecretKey |
| 阿里云 | dns_ali |
Ali_Key, Ali_Secret |
| AWS Route53 | dns_aws |
AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY |
- 登录 DNSPod 控制台
- 进入 API 密钥管理
- 创建 DNSPod Token
- 获取 ID 和 Token
export DP_Id="your_dnspod_id"
export DP_Key="your_dnspod_key"- 登录 腾讯云控制台
- 进入访问管理 → API 密钥管理
- 创建密钥或使用子账号密钥
- 获取 SecretId 和 SecretKey
export Tencent_SecretId="your_secret_id"
export Tencent_SecretKey="your_secret_key"- 登录 阿里云 RAM 控制台
- 创建用户并生成 AccessKey
- 授予
AliyunDNSFullAccess权限 - 获取 AccessKey ID 和 Secret
export Ali_Key="your_access_key_id"
export Ali_Secret="your_access_key_secret"- 登录 AWS IAM 控制台
- 创建用户并生成访问密钥
- 授予 Route53 相关权限
- 获取 Access Key ID 和 Secret
export AWS_ACCESS_KEY_ID="your_access_key_id"
export AWS_SECRET_ACCESS_KEY="your_secret_access_key"-
DNS 验证失败
- 检查 DNS 服务商的 API 密钥是否正确
- 确认域名解析服务商与配置的服务商一致
- 检查网络连接和防火墙设置
-
文件验证失败
- 确认网站根目录路径正确
- 检查 Web 服务器是否正常运行
- 确认域名能够正常访问
-
证书安装失败
- 检查证书和私钥文件路径权限
- 确认 Web 服务器配置语法正确
- 查看 Web 服务器错误日志
# 查看脚本日志
tail -f /var/log/ssl_acme.log
# 查看 acme.sh 日志
tail -f ~/.acme.sh/acme.sh.log-
保护 API 密钥
- 使用子账号密钥,限制权限范围
- 定期轮换 API 密钥
- 不要在脚本中硬编码密钥
-
证书文件权限
- 私钥文件权限设置为 600
- 证书文件权限设置为 644
- 使用专用用户运行 Web 服务器
-
定期备份
- 定期备份证书文件
- 测试备份恢复流程
- 保留多个备份版本
本脚本基于 MIT 许可证发布,详见 LICENSE 文件。
欢迎提交 Issue 和 Pull Request 来改进这个脚本。
如果您在使用过程中遇到问题,请:
- 查看本文档的故障排除部分
- 检查脚本日志文件
- 提交 Issue 并提供详细的错误信息