实现自动续期的核心步骤包括安装acme.sh工具、申请证书、配置自动续期任务等,利用ACME协议实现SSL证书自动续期(如Let's Encrypt、FreeSSL等),主要通过acme.sh工具自动化完成证书申请、验证和续期,确保HTTPS服务持续可用。下面是关键步骤和最佳实践:
一、核心工具与原理
ACME协议作用
ACME协议由Let's Encrypt等CA机构提供,支持自动化证书管理。acme.sh作为客户端工具,通过DNS或HTTP验证域名所有权,并自动处理证书申请、续期和部署。
自动续期机制
证书有效期通常为90天,acme.sh默认在到期前30天自动续期。
通过系统Cron任务每日检查证书状态,触发续期流程。
续期后自动执行预设的重载命令(如重启Nginx/Apache),无需人工干预。
二、实现步骤详解
1. 安装acme.sh
bash
推荐使用root用户安装
curl https://get.acme.sh | sh -s email=your@email.com
或使用国内镜像(若官方源慢)
curl https://gitcode.net/cert/cn-acme.sh/-/raw/master/install.sh?inline=false | sh -s email=your@email.com
安装后需重新连接终端使命令生效。
2. 申请证书(以DNS验证为例)
需提前获取域名服务商的API密钥(如阿里云、GoDaddy等):
bash
阿里云示例
export Ali_Key="xxxxxx" # API Key
export Ali_Secret="xxxxxx" # API Secret
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
关键参数:
--dns dns_ali:指定阿里云DNS(其他服务商如dns_dp(腾讯云)、dns_gd(GoDaddy))。
-d *.example.com:支持通配符证书。
注意:首次使用可能需注册CA账户(如ZeroSSL):
acme.sh --register-account -m your@email.com --server letsencrypt。
3. 安装证书并配置自动续期
指定证书存储路径和重载服务命令:
bash
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com/key.pem \
--fullchain-file /etc/nginx/ssl/example.com/cert.pem \
--reloadcmd "systemctl reload nginx" # 或"service httpd force-reload"(Apache)
自动续期触发:
此命令会自动创建Cron任务(每日检查续期),无需手动配置。
4. 配置Web服务器
Nginx示例:
nginx
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/example.com/cert.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/key.pem;
}
Apache示例:
类似修改SSLCertificateFile和SSLCertificateKeyFile路径。
三、关键配置与问题排查
1. 确保自动续期生效
验证Cron任务:
执行crontab -e查看是否存在类似任务(默认每天执行):
0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null。
手动测试续期:
bash
/root/.acme.sh/acme.sh --cron --debug 2 # 调试模式查看日志
2. 权限与路径问题
证书目录权限:
Apache需确保证书可被apache用户读取:
bash
chown root:apache /etc/httpd/ssl/* && chmod 750 /etc/httpd/ssl:cite[8]
使用绝对路径:
Cron任务和--reloadcmd中的命令需用绝对路径(如/usr/bin/systemctl)。
3. 域名服务商限制
子账号权限:
阿里云子账号需添加AliyunDNSFullAccess权限,否则无法添加DNS解析记录。
DNS生效延迟:
某些服务商API响应慢,可在命令中添加--dnssleep 120(等待120秒)。
四、最佳实践
启用自动更新:
acme.sh --upgrade --auto-upgrade 确保工具版本最新。
日志监控:
将Cron任务输出重定向到日志文件(如>> /var/log/acme.log),便于排查。
集群环境:
证书更新后,通过脚本分发到多台服务器(如rsync),并批量重启服务。
通知机制:
续期失败时发送邮件:
acme.sh --set-notify --notify-hook mailto:admin@example.com。
总结一下:
利用acme.sh+ACME协议实现自动续期,核心在于:
正确配置DNS API验证
通过--install-cert设置证书路径和服务重载命令
依赖内置Cron任务触发续期流程
若使用FreeSSL等国内服务,需在--issue命令中添加专属ACME地址:--server https://acme.freessl.cn/v2/...。遇到续期失败时,优先检查域名解析、API权限及服务重载命令有效性。