Email:2225994292@qq.com
CNY
如何使用acme.sh工具自动部署SSL证书全流程指南
更新时间:2025-08-11 作者:自动部署SSL证书

acme.sh作为一款开源的ACME协议客户端工具,以轻量、自动化、跨平台的特性被广泛应用 —— 它支持通过Let's Encrypt等免费证书机构自动申请、部署和续期SSL证书,无需复杂的手动操作。本文将详细讲解acme.sh的安装配置、证书申请、多场景部署(如 Nginx、Apache、CDN)以及自动续期的全流程,帮助用户快速实现SSL证书的自动化管理。

一、acme.sh工具的核心优势与准备工作

acme.sh的设计目标是 “零依赖、全自动”,相比其他ACME客户端(如 Certbot),其核心优势体现在:

  • 跨平台支持:可运行于 Linux、macOS、FreeBSD等系统,甚至支持嵌入式设备;
  • 无外部依赖:仅需基础Shell环境(bash/sh),无需Python或其他语言环境;
  • 自动续期:默认启用 90 天证书自动续期,续期后可自动重启服务;
  • 多验证方式:支持HTTP-01、DNS-01、TLS-ALPN-01等多种域名验证方式;
  • 多证书类型:支持单域名多域名通配符证书(需DNS验证)。

部署前的准备工作

1. 域名与服务器:

  • 拥有一个已注册的域名(如example.com),且能控制域名的DNS解析或服务器文件系统;
  • 服务器需开放 80 端口(HTTP-01 验证)或 443 端口(TLS-ALPN-01 验证),或具备DNS解析管理权限(DNS-01 验证);
  • 服务器已安装目标Web服务(如 Nginx、Apache),并能通过SSH登录操作。

2. 环境检查:

  • 确认服务器安装curlwget(用于下载acme.sh);
  • 确认crontab服务正常运行(用于自动续期,大部分Linux系统默认安装);
  • 以root权限登录服务器(部分操作需要权限,如修改Web服务配置)。

二、acme.sh的安装与初始化

acme.sh的安装过程简洁,通过一行命令即可完成,同时会自动配置基础环境。

步骤 1:安装acme.sh

使用curlwget下载并执行安装脚本:

1    # 方法1:使用curl
2    curl https://get.acme.sh| sh
3 
4    # 方法2:使用wget
5    wget -O - https://get.acme.sh| sh

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

  • 将acme.sh安装到用户目录(默认~/.acme.sh/);
  • 创建alias别名acme.sh=~/.acme.sh/acme.sh,方便命令调用;
  • 自动配置crontab任务(每天 0:00 检查证书续期);
  • 安装完成后,关闭当前终端并重新登录,使alias生效。

步骤 2:验证安装结果

执行以下命令查看版本,确认安装成功:

1    acme.sh--version
2    # 输出示例:acme.shv3.0.6

步骤 3:切换证书机构(可选)

acme.sh默认使用Let's Encrypt的生产环境,但也支持其他ACME协议证书机构,如 ZeroSSL、Buypass等。切换方法:

1    # 切换到ZeroSSL(需先注册,邮箱用于接收证书通知)
2   acme.sh--register-account -m your@email.com --server zerossl
3
4    # 切换回Let's Encrypt
5   acme.sh--server letsencrypt

注意:生产环境建议使用Let's Encrypt或ZeroSSL,测试环境可使用Let's Encrypt的staging服务器(避免证书申请频率限制):

1   acme.sh--server letsencrypt --staging

三、SSL证书的申请:三种验证方式详解

申请证书的核心是通过ACME协议向证书机构证明 “域名所有权”,acme.sh支持三种主流验证方式,需根据服务器环境选择。

方式 1:HTTP-01 验证(最常用,适用于有Web服务的服务器)

HTTP-01 验证通过在服务器的/.well-known/acme-challenge/路径下放置验证文件,让证书机构的爬虫访问该文件以确认域名控制权。

适用场景:

  • 服务器已运行Web服务(Nginx/Apache),且 80 端口可正常访问;
  • 需申请单域名或多域名证书(不支持通配符证书)。

操作步骤:

1. 停止占用 80 端口的服务(若acme.sh自动配置):

部分情况下,acme.sh会临时启动内置Web服务器占用 80 端口,需先停止当前Web服务:

1    # 以Nginx为例
2    systemctl stop nginx

2. 申请证书:

使用--issue命令,指定域名和Web根目录(Web 服务的根路径):

1    # 单域名证书
2   acme.sh--issue -d example.com -w /var/www/html
3
4    # 多域名证书(主域名+子域名)
5   acme.sh--issue -d example.com -d www.example.com -w /var/www/html

其中:

  • -d:指定域名(可多次使用添加多个域名);
  • -w:指定Web根目录(需确保该目录可写,且Web服务配置正确指向该目录)。

3. 验证与证书生成:

执行命令后,acme.sh会自动在/var/www/html/.well-known/acme-challenge/下生成验证文件,并临时启动Web服务(若未指定-w)。证书机构验证通过后,证书会生成在~/.acme.sh/example.com/目录下。

4. 重启Web服务:

1    systemctl start nginx

方式 2:DNS-01 验证(支持通配符证书,适用于有DNS管理权限的场景)

DNS-01 验证通过在域名的DNS解析记录中添加TXT记录,让证书机构查询该记录以确认所有权,支持通配符证书(如*.example.com)。

适用场景:

  • 需要申请通配符证书(如*.example.com覆盖所有子域名);
  • 服务器 80/443 端口不可访问(如仅开放SSH的后端服务器);
  • 拥有域名的DNS管理权限(如 Cloudflare、阿里云DNS等)。

操作步骤:

1. 手动添加TXT记录(通用方法):

1    # 申请通配符证书
2   acme.sh--issue -d example.com -d *.example.com --dns
3
4    # 执行后,命令行会提示需要添加的TXT记录,例如:
5    # Please add the following TXT record:
6    # Domain: _acme-challenge.example.com
7    # TXT value: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2. 在DNS管理平台添加 TXT 记录:

登录域名的DNS管理界面(如阿里云 DNS、Cloudflare),添加提示中的TXT记录,主机记录为_acme-challenge,记录值为提示的字符串。

3. 等待DNS生效并完成验证:

DNS 记录生效可能需要 1-10 分钟(取决于TTL设置),可通过nslookup验证:

1    nslookup -type=TXT _acme-challenge.example.com

确认记录生效后,重新执行证书申请命令(无需再次添加记录,acme.sh会自动检测):

1   acme.sh--issue -d example.com -d *.example.com --dns

4. 自动添加DNS记录(推荐,需API支持):

若域名托管在支持API的DNS服务商(如 Cloudflare、阿里云),可通过配置API密钥实现TXT记录自动添加,无需手动操作:

1    # 以Cloudflare为例,先设置API密钥
2    export CF_Key="your_cloudflare_global_api_key"
3    export CF_Email="your_cloudflare_email"
4
5    # 自动申请通配符证书
6   acme.sh--issue -d example.com -d *.example.com --dns dns_cf

支持的DNS服务商及配置方法可参考acme.sh官方文档。

方式 3:TLS-ALPN-01 验证(适用于仅开放 443 端口的服务器)

TLS-ALPN-01 验证通过在TLS握手过程中传递验证信息,需服务器开放 443 端口,适用于无法使用 80 端口的场景。

适用场景:

  • 服务器仅开放 443 端口,80 端口被封禁或占用;
  • 需申请单域名或多域名证书(不支持通配符)。

操作步骤:

1    # 停止占用443端口的服务
2    systemctl stop nginx
3
4    # 申请证书(使用--alpn参数)
5   acme.sh--issue -d example.com --alpn
6 
7    # 重启服务
8    systemctl start nginx

注意:该方式依赖TLS ALPN协议,部分老旧服务器可能不支持,建议优先使用 HTTP-01 或 DNS-01。

四、证书部署:从生成到生效的关键步骤

申请SSL证书后,证书文件存储在~/.acme.sh/域名/目录下,但直接使用该目录的文件存在风险(acme.sh可能自动更新目录结构)。正确的做法是将证书部署到Web服务的配置目录,并配置自动更新。

部署到Nginx服务器

1. 创建证书存放目录:

Nginx 通常从/etc/nginx/ssl/目录读取证书,创建该目录并设置权限:

1    mkdir -p /etc/nginx/ssl/example.com
2    chmod 700 /etc/nginx/ssl

2. 部署证书:

使用--install-cert命令将证书复制到目标目录,并配置自动续期后重启 Nginx:

1   acme.sh--install-cert -d example.com \
2      --key-file /etc/nginx/ssl/example.com/key.pem \
3      --fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \
4      --reloadcmd "systemctl reload nginx"

参数说明:

  • --key-file:私钥文件路径;
  • --fullchain-file:包含服务器证书和中间证书的完整链文件;
  • --reloadcmd:证书更新后执行的命令(重启或重载Web服务)。

3. 配置Nginx启用HTTPS:

编辑Nginx配置文件(如/etc/nginx/sites-available/example.com):

1    server {
2        listen 443 ssl;
3        server_name example.com www.example.com;
4   
5        ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
6        ssl_certificate_key /etc/nginx/ssl/example.com/key.pem;
7
8        # 推荐的SSL配置(增强安全性)
9        ssl_protocols TLSv1.2 TLSv1.3;
10      ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
11      ssl_prefer_server_ciphers on;
12      ssl_session_cache shared:SSL:10m;
13
14      # 网站根目录
15     root/var/www/html;
16      index index.html;
17  }
18
19  # HTTP自动跳转HTTPS
20  server {
21      listen 80;
22      server_name example.com www.example.com;
23      return 301 https://$host$request_uri;
24  }

4. 验证配置并重启Nginx:

1    nginx -t  # 验证配置是否正确
2    systemctl reload nginx

部署到Apache服务器

1. 创建证书存放目录:

1    mkdir -p /etc/httpd/ssl/example.com
2    chmod 700 /etc/httpd/ssl

2. 部署证书:

1   acme.sh--install-cert -d example.com \
2      --key-file /etc/httpd/ssl/example.com/key.pem \
3      --fullchain-file /etc/httpd/ssl/example.com/fullchain.pem \
4      --reloadcmd "systemctl reload httpd"

3. 配置Apache启用HTTPS

编辑Apache配置文件(如/etc/httpd/conf.d/ssl.conf或虚拟主机配置):

1    <VirtualHost *:443>
2        ServerName example.com
3        ServerAlias www.example.com
4
5        SSLEngine on
6        SSLCertificateFile /etc/httpd/ssl/example.com/fullchain.pem
7        SSLCertificateKeyFile /etc/httpd/ssl/example.com/key.pem
8
9        # 推荐的SSL配置
10      SSLProtocol TLSv1.2 TLSv1.3
11      SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
12      SSLHonorCipherOrder on
13
14      DocumentRoot /var/www/html
15      <Directory /var/www/html>
16          AllowOverride All
17          Require all granted
18      </Directory>
19  </VirtualHost>
20
21  # HTTP跳转HTTPS
22  <VirtualHost *:80>
23      ServerName example.com
24      ServerAlias www.example.com
25      Redirect permanent / https://example.com/
26  </VirtualHost>

4. 重启Apache:

1    systemctl reload httpd

部署到其他场景(如 CDN、负载均衡器)

对于需要将证书部署到CDN(如 Cloudflare)、负载均衡器(如 HAProxy)或云服务(如 AWS ALB)的场景,可手动导出证书文件,再按平台要求上传:

1. 获取证书文件路径:

1    # 查看证书存储目录
2   acme.sh--list
3    # 输出示例:Main_Domain: example.com, KeyLength: 2048, Domains: example.com, www.example.com, KeyFile: ~/.acme.sh/example.com/example.com.key, ...

2. 复制证书到本地或直接上传:

通过scpfullchain.pem(证书链)和key.pem(私钥)复制到本地,再上传至目标平台的证书管理界面。

3. 配置自动同步(可选):

若平台支持API,可编写脚本实现证书更新后自动同步,例如通过Cloudflare API更新边缘证书:

1    # 在--reloadcmd中添加同步命令(示例)
2   acme.sh--install-cert -d example.com \
3      --key-file /path/to/key.pem \
4      --fullchain-file /path/to/fullchain.pem \
5      --reloadcmd "systemctl reload nginx && /path/to/cloudflare-cert-sync.sh"

五、证书自动续期与管理

Let's Encrypt等免费证书的有效期为 90 天,acme.sh默认启用自动续期,但需确保续期机制正常运行。

1. 查看自动续期任务

acme.sh安装时会自动添加 crontab 任务,执行以下命令查看:

1    crontab -l
2    # 输出示例:0 0 * * * "/root/.acme.sh"/acme.sh--cron --home "/root/.acme.sh" > /dev/null

该任务每天凌晨 0 点运行,检查所有证书是否需要续期(默认到期前 30 天自动续期)。

2. 手动触发续期测试

1    # 测试续期(不实际执行,仅模拟)
2   acme.sh--cron --dry-run
3
4    # 强制续期(用于测试,生产环境谨慎使用)
5   acme.sh--renew -d example.com --force

3. 证书管理常用命令

  • 查看已申请的证书:
1   acme.sh--list
  • 删除证书:
1   acme.sh--remove -d example.com
  • 备份证书:

证书默认存储在~/.acme.sh/目录,可直接打包备份:

1    tar -zcvf acme_backup.tar.gz ~/.acme.sh/
  • 恢复证书:

将备份文件解压到原目录,重新执行部署命令即可:

1    tar -zxvf acme_backup.tar.gz -C ~/
2   acme.sh--install-cert -d example.com [其他参数]

六、常见问题与解决方案

1. 验证失败:“Timeout during connect (likely firewall problem)”

原因:证书机构的验证服务器无法访问目标服务器的 80 端口(HTTP-01 验证)或 443 端口(TLS-ALPN-01 验证),可能由以下因素导致:

  • 服务器防火墙(如 iptables、firewalld)未开放 80/443 端口;
  • 云服务商的安全组规则限制了端口访问(如 AWS Security Group、阿里云安全组);
  • 服务器位于NAT网关后,端口映射未正确配置;
  • 域名解析错误,指向的 IP 地址与服务器实际 IP 不符。

解决方案:

  • 检查端口开放状态:
1    # 查看80端口是否开放
2    firewall-cmd --query-port=80/tcp  # 适用于firewalld
3    iptables -L | grep 80             # 适用于iptables
4
5    # 若未开放,添加规则
6    firewall-cmd --add-port=80/tcp --permanent
7    firewall-cmd --reload
  • 检查云服务商安全组:登录云控制台,确保 80/443 端口允许所有IP访问(验证期间临时开放,后续可限制来源);
  • 验证域名解析:
1    nslookup example.com  # 确认解析的IP与服务器公网IP一致
  • 临时关闭Web应用防火墙(WAF):部分WAF可能拦截验证请求,验证通过后再重新启用。

2. DNS验证失败:“Invalid TXT record”

原因:证书机构未查询到预期的TXT记录,可能原因包括:

  • TXT记录未正确添加(主机记录应为_acme-challenge,而非完整域名);
  • DNS记录未生效(TTL设置过大,需等待缓存刷新);
  • 多域名验证时,每个域名的TXT记录混淆(如example.com与www.example.com的记录颠倒)。

解决方案:

  • 重新检查TXT记录配置:

主机记录:_acme-challenge(单域名)或_acme-challenge.www(子域名www.example.com);

记录值:严格匹配acme.sh输出的字符串(区分大小写,无空格);

  • 强制刷新DNS缓存:
1    # 清除本地 DNS 缓存(部分系统支持)
2    systemctl restart systemd-resolved

多域名验证时,按提示分别添加对应域名的TXT记录,避免混淆。

3. 自动续期失败:证书过期未更新

原因:自动续期依赖crontab任务和证书权限,常见失败原因:

  • crontab服务未运行(如crond未启动);
  • acme.sh的安装目录权限不足,无法读写证书文件;
  • 续期验证失败(如Web根目录变更、DNS配置修改);
  • --reloadcmd命令错误,导致续期后服务未重启。

解决方案:

  • 检查crontab服务状态:
1    systemctl status crond  # 确保服务处于running状态
  • 查看续期日志(关键排查依据):
1   acme.sh--cron --home ~/.acme.sh/  # 手动执行续期并查看输出
2    cat ~/.acme.sh/acme.sh.log        # 查看详细日志

验证--reloadcmd有效性:直接执行该命令,确认服务能正常重启(如systemctl reload nginx);

  • 重新配置自动续期:若原配置失效,删除证书后重新申请并部署。

4. 权限错误:“Permission denied”

原因:acme.sh执行用户(如非root用户)无权限操作目标文件或目录,常见于:

  • 尝试将证书部署到系统目录(如/etc/nginx/)时权限不足;
  • Web根目录(-w指定)的所有者与执行用户不符。

解决方案:

  • 以root用户执行命令(推荐,避免权限问题);
  • 为非root用户赋予目标目录权限:
1    chown -R $USER:$USER /etc/nginx/ssl  # 替换$USER为实际用户名
  • 检查Web根目录权限:确保acme.sh可在/.well-known/acme-challenge/下创建文件。

acme.sh工具通过自动化的SSL证书申请、部署与续期流程,极大简化了SSL证书的管理工作,尤其适合中小型网站、个人博客等场景。其核心优势在于零依赖、高灵活性和强大的自动化能力,支持多种验证方式和部署场景。


Dogssl.cn拥有20年网络安全服务经验,提供构涵盖国际CA机构SectigoDigicertGeoTrustGlobalSign,以及国内CA机构CFCA沃通vTrus上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!
相关文档
立即加入,让您的品牌更加安全可靠!
申请SSL证书
0.185709s