本文目录导读:

- 核心思路
- 方案一:使用
acme.sh(最推荐,通用性强) - 方案二:使用
certbot(Let's Encrypt 官方客户端) - 方案三:使用
lego(Go语言,无依赖) - 高级场景:DNS API + 泛域名
- 总结:哪种方案最适合你?
- 一个完整的自动化部署示例脚本(acme.sh)
- 小提示
是的,完全可以!通过脚本自动部署SSL证书是提升效率和避免手动操作失误的常用方法,具体实现方式取决于你使用的证书类型、Web服务器(如Nginx、Apache)以及部署环境。
以下是几种主流的自动化方案:
核心思路
利用 ACME 协议(自动化证书管理环境)的客户端工具,配合 Cron 定时任务 或 Webhook 触发器,在证书到期前自动续签并部署。
使用 acme.sh (最推荐,通用性强)
acme.sh 是目前最流行的开源ACME客户端,支持几乎所有主流DNS API和Web服务器。
安装及签发证书
# 安装 acme.sh curl https://get.acme.sh | sh -s email=你的邮箱@example.com # 使用 Standalone 模式(临时占用80端口)或 Webroot 模式签发 # 为 example.com 和 www.example.com 签发 acme.sh --issue -d example.com -d www.example.com --webroot /var/www/html
编写部署脚本(核心步骤)
在签发完成后,添加 --install-cert 命令,将证书文件和密钥复制到Web服务器目录并重载服务。
示例:部署到 Nginx
acme.sh --install-cert -d example.com \ --cert-file /etc/nginx/ssl/example.com/cert.pem \ --key-file /etc/nginx/ssl/example.com/key.pem \ --fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \ --reloadcmd "systemctl reload nginx"
--reloadcmd是关键,在证书更新后自动执行(如nginx -s reload或apache2ctl graceful)。
自动续期
acme.sh 默认会安装一个 Cron 定时任务(每天检查一次),无需额外操作,它会自动:
- 检测证书是否即将到期(通常提前60天)。
- 重新挑战域名验证。
- 运行你之前设定的
--install-cert命令(包括复制证书和重载服务)。
验证Cron:
crontab -l会看到类似0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
使用 certbot (Let's Encrypt 官方客户端)
certbot 针对特定Web服务器有原生插件,实现“一键集成”。
安装并自动配置
# 以Nginx为例 certbot --nginx -d example.com -d www.example.com # 或 Apache certbot --apache -d example.com
这会自动修改你的Nginx配置文件,添加SSL相关指令。
自动续期(默认已配置)
certbot 会添加一个 systemd timer 或 cron job,每天检查两次,续期后,它会自动重载Nginx/Apache。
# 测试续期是否工作 certbot renew --dry-run
优点
- 与Web服务器深度集成。
- 官方维护,文档详尽。
缺点
- 可能需要root权限修改系统配置。
- 对非标准路径或自定义配置(如反向代理)适配稍复杂。
使用 lego (Go语言,无依赖)
适合不想安装Python或bash工具的纯Go环境。
# 签发 lego --email="你@example.com" --domains="example.com" --http run # 自定义部署脚本 lego --email="你@example.com" --domains="example.com" --http renew --days 30 # 然后编写一个脚本将生成的 .crt 和 .key 复制到目标路径并 reload Nginx
高级场景:DNS API + 泛域名
如果你的服务器没有公开的80/443端口(如内网服务、负载均衡器后),或者需要为 *.example.com 签发泛域名证书,必须使用 DNS Challenge。
# 以 acme.sh + Cloudflare API 为例 export CF_Token="你的Cloudflare API Token" acme.sh --issue --dns dns_cf -d example.com -d '*.example.com' # 部署脚本同上 acme.sh --install-cert -d '*.example.com' \ --fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \ --key-file /etc/nginx/ssl/example.com/privkey.pem \ --reloadcmd "systemctl reload nginx"
注意:使用泛域名时,命令行中的 -d 参数必须显式包含 example.com 和 '*.example.com' 两个条目。
哪种方案最适合你?
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 通用,支持多种服务器 | acme.sh |
灵活、无依赖、安装简单,自动处理续期+部署 |
| Nginx新手,希望开箱即用 | certbot --nginx |
自动修改配置,官方支持 |
| 需要部署到不开放80端口的环境 | acme.sh + DNS API |
支持100+ DNS提供商,自动验证 |
| 需要下载证书到本地后手动部署 | 脚本 + SCP/SFTP | 下载时使用 --fullchain-file 和 --key-file |
一个完整的自动化部署示例脚本(acme.sh)
假设你有一个Nginx站点的配置路径 /etc/nginx/sites-enabled/example.com.conf,且SSL文件放在 /etc/nginx/ssl/example.com/:
#!/bin/bash # auto-ssl-deploy.sh DOMAIN="example.com" NGINX_SSL_DIR="/etc/nginx/ssl/$DOMAIN" NGINX_CONF="/etc/nginx/sites-enabled/$DOMAIN.conf" # 1. 签发/续期 acme.sh --issue -d "$DOMAIN" -d "www.$DOMAIN" --webroot /var/www/html # 2. 安装证书并重载Nginx acme.sh --install-cert -d "$DOMAIN" \ --key-file "$NGINX_SSL_DIR/privkey.pem" \ --fullchain-file "$NGINX_SSL_DIR/fullchain.pem" \ --reloadcmd "nginx -t && systemctl reload nginx" echo "证书部署完成:$(date)"
设置定时任务(每天凌晨2点检查):
0 2 * * * /root/auto-ssl-deploy.sh >> /var/log/ssl-renewal.log 2>&1
小提示
- 测试阶段:使用 Let's Encrypt 的 Staging 环境,避免因配置错误被限流:
- acme.sh:
--server https://acme-staging-v02.api.letsencrypt.org/directory - certbot:
--staging
- acme.sh:
- 通知:可在
--reloadcmd后追加&& curl -s https://your-monitoring-api/alert?msg=ssl-updated来监控结果。
脚本自动部署SSL证书不仅能解放双手,还能避免因证书过期导致的网站安全警告或服务中断,先从 acme.sh 入手是最稳妥的选择。