实现自动续期的核心步骤包括安装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权限及服务重载命令有效性。