用户手动更新  SSL证书不仅繁琐,还容易因忘记续期导致网站无法访问。`acme.sh`  是一个纯  Shell  脚本工具,能帮你实现证书的自动申请、安装和续期,配置好后可以完全不用再操心。

整个搭建过程可以分为以下四个步骤:

mermaid

flowchart  TD

        A[开始:安装  acme.sh]  -->  B[申请  SSL  证书]

        

        B  -->  C{选择验证方式}

        

        C  --  方式一  -->  D[HTTP  验证<br>需  80  端口访问]

        C  --  方式二  -->  E[DNS  验证<br>推荐泛域名证书]

        

        D  -->  F[安装证书到  Web  服务器<br>如  Nginx/Apache]

        E  -->  F

        

        F  -->  G[验证自动续期<br>cron  任务  +  手动测试]

        G  -->  H[完成:全自动管理]

  第一步:安装  acme.sh

在你的服务器上执行以下命令即可完成安装。它会自动安装在  `~/.acme.sh/`  目录下,并设置好别名。

bash

安装  acme.sh,请将邮箱替换为你自己的

curl  https://get.acme.sh  |  sh  -s  email=my@example.com

使别名在当前会话中生效

source  ~/.bashrc

查看版本,确认安装成功

acme.sh  --version

>  💡  小提示:`acme.sh`  的默认证书颁发机构是  ZeroSSL。如果你更习惯使用  Let's  Encrypt,可以切换默认  CA:

>  `acme.sh  --set-default-ca  --server  letsencrypt`  

第二步:申请  SSL证书

`acme.sh`  支持多种方式验证你对域名的所有权。这里介绍最常用的两种。

方式一:HTTP  验证

适用场景:你的网站已经部署,且  80  端口可以从公网访问。

这是最简单的方法,`acme.sh`  会自动在网站根目录下生成验证文件,验证通过后自动删除。

bash

#  --nginx  参数会自动识别  Nginx  配置并完成验证

acme.sh  --issue  -d  example.com  -d  www.example.com  --nginx

#  如果你的  Web  服务器是  Apache,可以使用  --apache

#  acme.sh  --issue  -d  example.com  --apache

#  如果服务器没有运行  Web  服务,也可以使用  --standalone  模式,它会临时启用一个  Web  服务器

#  acme.sh  --issue  -d  example.com  --standalone

方式二:DNS  验证(推荐,支持泛域名)

适用场景:需要申请泛域名证书(如  `*.example.com`),或者服务器没有公网  IP。

这种方式需要你的  DNS  服务商支持  API。`acme.sh`  支持绝大多数  DNS  服务商(阿里云、腾讯云、Cloudflare  等)。

以阿里云为例:

bash

#  1.  设置你的  API  密钥(注意:这些信息不要泄露)

export  Ali_Key="你的阿里云AccessKey  ID"

export  Ali_Secret="你的阿里云AccessKey  Secret"

#  2.  申请泛域名证书(-d  参数可以多次使用,同时申请多个域名)

acme.sh  --issue  --dns  dns_ali  -d  example.com  -d  '*.example.com'

首次使用时,`acme.sh`  会提示你添加一条  TXT  解析记录来验证,**第二次申请相同域名时就会全自动完成,无需手动干预**。

申请成功后,API  密钥会被  `acme.sh`  保存,后续续期时会自动调用。

第三步:安装证书到  Web  服务器

非常重要的一点:`acme.sh`  不建议直接使用  `~/.acme.sh/`  目录下的证书文件。正确的做法是使用  `--install-cert`  命令将证书安装到指定目录,这样在证书自动续期后,`acme.sh`  也会自动将新证书复制过去,并重启  Web  服务。

以  Nginx  为例:

bash

acme.sh  --install-cert  -d  example.com  \

    --key-file              /etc/nginx/ssl/example.com.key  \

    --fullchain-file  /etc/nginx/ssl/example.com.crt  \

    --reloadcmd            "systemctl  reload  nginx"

命令执行后:

1.    证书文件会被复制到  `/etc/nginx/ssl/`  目录。

2.    `--reloadcmd`  指定的命令会在证书更新后自动执行,使  Nginx  重新加载新证书,整个过程无需人工参与。

之后,记得在你的  Nginx  站点配置中指定这两个文件路径:

nginx

server  {

        listen  443  ssl;

        server_name  example.com;

        ssl_certificate          /etc/nginx/ssl/example.com.crt;

        ssl_certificate_key  /etc/nginx/ssl/example.com.key;

        #  ...  其他配置

}

第四步:验证自动续期是否生效

`acme.sh`  在安装时会自动为你创建一个  `cron`  定时任务,通常每天会检查一次,当证书剩余有效期小于  60  天时就会自动续期。你可以通过以下命令查看定时任务:

bash

crontab  -l

你应该能看到一条类似  `...  acme.sh  --cron  ...`  的记录。如果想手动测试续期逻辑是否正常,可以执行:

bash

#  --force  参数会强制续期,用来测试整个流程

acme.sh  --renew  -d  example.com  --force

如果上述命令执行成功,且  Web  服务被正确重载,那么你的自动续签系统就搭建完成了。

快速上手指南

根据你的实际情况,可以参考以下配置路径:

你的场景      推荐方案            关键命令  

已有Nginx/Apache            HTTP  验证            `acme.sh  --issue  -d  你的域名  --nginx`  

需要泛域名证书            DNS  验证          `acme.sh  --issue  --dns  dns_你的DNS商  -d  你的域名  -d  '*.你的域名'`  

申请完成后          安装证书        `acme.sh  --install-cert  -d  你的域名  --key-file  路径  --fullchain-file  路径  --reloadcmd  "重载命令"`  

配置完成后,就放心地把SSL证书管理交给  `acme.sh`,告别手动更新的焦虑吧。