多域名证书管理:acme.sh实现100+SAN自动续期的高效方法

多域名证书管理:acme.sh实现100+SAN自动续期的高效方法

【免费下载链接】acme.sh 【免费下载链接】acme.sh 项目地址: https://gitcode.com/gh_mirrors/acm/acme.sh

在现代Web服务架构中,管理多个域名的SSL证书(尤其是包含100+ Subject Alternative Names,即SAN的证书)是运维人员面临的常见挑战。手动更新不仅耗时,还可能因人为疏忽导致服务中断。本文将介绍如何使用acme.sh这一轻量级工具,实现多域名证书的自动化申请、部署与续期,彻底摆脱证书管理的繁琐工作。

为什么选择acme.sh?

acme.sh是一款纯Shell脚本实现的ACME(Automated Certificate Management Environment)协议客户端,具有以下核心优势:

  • 零依赖:无需Python或其他编程语言环境,仅需基础Shell支持
  • 多模式支持:Webroot、Standalone、DNS验证等多种证书申请方式
  • 自动续期:默认60天自动检查并更新证书,无需人工干预
  • 多CA支持:兼容Let's Encrypt、ZeroSSL等主流证书颁发机构
  • 丰富集成:提供超过30种服务器部署脚本和100+DNS服务商API支持

项目核心文件为acme.sh,采用GPLv3开源协议,目前已被Proxmoxpfsense等知名项目采用。

快速开始:安装与初始化

安装acme.sh

通过Git仓库安装是推荐的方式,确保获取最新功能和安全更新:

git clone https://gitcode.com/gh_mirrors/acm/acme.sh.git
cd ./acme.sh
./acme.sh --install -m your@email.com

安装脚本会自动完成以下操作:

  1. 将acme.sh复制到~/.acme.sh/目录
  2. 创建命令别名:acme.sh=~/.acme.sh/acme.sh
  3. 设置每日Cron任务,自动检查证书续期

安装完成后,关闭当前终端并重新打开,使别名生效。验证安装:

acme.sh --version

多域名证书申请实战

单命令申请100+SAN证书

使用--issue命令配合多个-d参数即可创建包含多个域名的证书:

acme.sh --issue \
  -d example.com \
  -d www.example.com \
  -d api.example.com \
  -d app.example.com \
  # 添加更多域名...
  -w /var/www/example.com

参数说明:

  • -d:指定域名(主域名或SAN),可重复多次添加多个域名
  • -w:Webroot路径,用于HTTP验证(需确保所有域名指向该目录)

注意:虽然ACME协议理论支持无限SAN,但实际使用中建议将SAN数量控制在100个以内,避免部分CA的限制和验证超时问题。

DNS验证:无需Web服务器的证书申请

对于无法开放80/443端口的场景(如内网服务),DNS验证是理想选择。以某服务商DNS为例:

  1. 首先设置服务商API密钥环境变量:
export DNSPLUGIN_Key="your_dns_provider_api_key"
export DNSPLUGIN_Email="your_dns_provider_email"
  1. 使用DNS模式申请证书:
acme.sh --issue \
  -d example.com \
  -d "*.example.com" \
  -d "*.sub.example.com" \
  --dns dns_dnsprovider

这里--dns dns_dnsprovider指定使用dnsapi/dns_dnsprovider.sh插件,acme.sh会自动添加并清理DNS TXT记录完成验证。项目提供的DNS插件涵盖国内外主流服务商,完整列表见dnsapi/目录。

证书自动部署与续期

部署到Web服务器

证书申请成功后,需将证书部署到实际服务中。使用--install-cert命令可自动完成复制和服务重载:

Nginx部署示例:
acme.sh --install-cert -d example.com \
  --key-file /etc/nginx/ssl/example.com.key \
  --fullchain-file /etc/nginx/ssl/example.com.cer \
  --reloadcmd "systemctl reload nginx"
Apache部署示例:
acme.sh --install-cert -d example.com \
  --cert-file /etc/apache2/ssl/example.com.crt \
  --key-file /etc/apache2/ssl/example.com.key \
  --fullchain-file /etc/apache2/ssl/fullchain.crt \
  --reloadcmd "systemctl reload apache2"

关键配置--reloadcmd参数确保证书更新后服务自动重载,这是实现零停机更新的核心步骤。

高级部署策略

对于复杂架构(如负载均衡集群),可使用项目提供的专用部署脚本:

例如,使用Docker部署时可将证书映射到容器内部:

docker run -d \
  -v ~/.acme.sh/example.com:/etc/ssl \
  --name nginx \
  nginx:alpine

大规模证书管理最佳实践

证书监控与通知

acme.sh支持多种通知方式,确保证书续期状态实时可控:

  1. 配置邮件通知:
acme.sh --set-notify --notify-email your@example.com
  1. 企业微信通知(通过notify/weixin_work.sh):
export WEIXIN_WORK_KEY="your_corp_id"
export WEIXIN_WORK_AGENT_ID="your_agent_id"
export WEIXIN_WORK_SECRET="your_app_secret"
acme.sh --set-notify --notify-hook weixin_work

支持的通知渠道包括钉钉、Slack、等,完整列表见notify/目录。

证书备份与恢复

定期备份证书目录可防止意外数据丢失:

# 创建备份
tar -czf acme_backup_$(date +%Y%m%d).tar.gz ~/.acme.sh

# 恢复备份
tar -xzf acme_backup_20231011.tar.gz -C ~/

证书文件默认存储在~/.acme.sh/[域名]/目录下,包含完整的证书链、私钥和配置信息。

性能优化:处理100+SAN证书

当管理包含大量SAN的证书时,建议进行以下优化:

  1. 使用DNS验证:避免HTTP验证时为每个域名创建验证文件
  2. 设置自定义续期周期:对于关键服务可缩短检查间隔
acme.sh --install-cronjob --cron-interval 12  # 每12小时检查一次
  1. 证书拆分策略:将相关域名分组管理,而非全部放在一个证书中

常见问题与解决方案

问题1:部分域名验证失败

解决方案:使用--debug参数查看详细验证过程,确认域名解析和服务器可达性:

acme.sh --issue -d example.com -d www.example.com -w /var/www/html --debug

问题2:证书续期后服务未生效

原因分析:通常是--reloadcmd配置错误或权限问题 解决方案:测试重载命令手动执行,确保无错误输出:

systemctl reload nginx  # 验证Nginx重载命令

问题3:DNS验证超时

解决方案:对于DNS记录生效慢的域名,可使用--dnssleep参数延长等待时间:

acme.sh --issue -d example.com --dns dns_dnsprovider --dnssleep 300  # 等待5分钟

总结与展望

通过acme.sh,我们实现了多域名证书的自动化生命周期管理,从根本上解决了传统证书管理的痛点。无论是中小型网站的几个域名,还是企业级服务的上百个SAN,acme.sh都能提供稳定高效的证书管理能力。

随着HTTPS的普及和证书安全要求的提高,自动化证书管理已成为运维标配。acme.sh作为轻量级解决方案,凭借其跨平台、易集成的特性,正在被越来越多的项目和企业采用。

建议定期通过acme.sh --upgrade更新到最新版本,获取新功能和安全修复。如有定制需求,可参考开发文档进行二次开发。

下一步行动

  1. 收藏本文以备后续参考
  2. 立即尝试使用acme.sh管理你的第一个多域名证书
  3. 关注项目GitHub Issues获取最新动态

让我们一起告别证书管理的繁琐,专注于更有价值的工作!

【免费下载链接】acme.sh 【免费下载链接】acme.sh 项目地址: https://gitcode.com/gh_mirrors/acm/acme.sh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值