脚本能自动部署SSL证书到网站吗?

wen 实用脚本 1

本文目录导读:

脚本能自动部署SSL证书到网站吗?

  1. 核心思路
  2. 方案一:使用 acme.sh (最推荐,通用性强)
  3. 方案二:使用 certbot (Let's Encrypt 官方客户端)
  4. 方案三:使用 lego (Go语言,无依赖)
  5. 高级场景:DNS API + 泛域名
  6. 总结:哪种方案最适合你?
  7. 一个完整的自动化部署示例脚本(acme.sh)
  8. 小提示

是的,完全可以!通过脚本自动部署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 reloadapache2ctl graceful)。

自动续期

acme.sh 默认会安装一个 Cron 定时任务(每天检查一次),无需额外操作,它会自动:

  1. 检测证书是否即将到期(通常提前60天)。
  2. 重新挑战域名验证。
  3. 运行你之前设定的 --install-cert 命令(包括复制证书和重载服务)。

验证Croncrontab -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 timercron 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
  • 通知:可在 --reloadcmd 后追加 && curl -s https://your-monitoring-api/alert?msg=ssl-updated 来监控结果。

脚本自动部署SSL证书不仅能解放双手,还能避免因证书过期导致的网站安全警告或服务中断,先从 acme.sh 入手是最稳妥的选择。

抱歉,评论功能暂时关闭!