Acme.sh 是一个开源的脚本,能够从 ZeroSSL 、Let's Encrypt 等证书颁发机构(CA)获取免费的 HTTPS 证书。该脚本特别简单易用,并且支持多种验证方式。下面将详细介绍使用 Acme.sh 生成、安装和更新证书的各个步骤。
Github地址
使用说明
1. 安装 Acme.sh
安装 Acme.sh 可以通过简单的命令实现,并且不限制于 root 用户。普通用户也能顺利完成安装。
- 
命令安装 :
需要服务器能正常访问githubbashcurl https://get.acme.sh | sh -s email=my@example.com或
bashwget -O - https://get.acme.sh | sh -s email=my@example.com - 
从 GitHub 安装 :
bashcurl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m my@example.com或
bashwget -O - https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m my@example.com - 
git clone 并安装 :
(推荐)bashgit clone --depth 1 https://github.com/acmesh-official/acme.sh.git cd acme.sh ./acme.sh --install -m my@example.com - 
高级安装 :
bashgit clone --depth 1 https://github.com/acmesh-official/acme.sh.git cd acme.sh ./acme.sh --install \ --home ~/myacme \ --config-home ~/myacme/data \ --cert-home ~/mycerts \ --accountemail "my@example.com" \ --accountkey ~/myaccount.key \ --accountconf ~/myaccount.conf \ --useragent "this is my client."你不需要把它们都设置好,只需设置你关心的那些就行了。
解释:- --home是要在其中安装的自定义目录。默认情况下,它会安装到acme.sh~/.acme.sh
 - --config-home是一个可写文件夹,acme.sh 会把所有文件(包括证书/密钥、配置)都写入那里。默认情况下,它位于--home
 - --cert-home是用于保存您颁发的证书的自定义目录。默认情况下,它保存在 .--config-home
 - --accountemail是用于向 Let's Encrypt 注册帐户的电子邮件,您将在此处收到续订通知电子邮件。
 - --accountkey是保存您账户私钥的文件。默认情况下,它保存在 .--config-home
 - --useragent是用于发送到 Let's Encrypt 的用户代理标头值。
 - --nocron在没有 cronjob 的情况下安装 acme.sh
 
 
安装过程中,Acme.sh 会自动:
- 将自身安装到用户的 home 目录中的 
~/.acme.sh/文件夹。 - 在 shell 配置文件(如 
.bashrc)中创建一个别名以便于调用:alias acme.sh=~/.acme.sh/acme.sh。 - 创建一个 cronjob 任务,每天 0:00 自动检测所有证书的有效期。若证书即将过期,将自动进行更新。
 
如果安装完成后遇到 -bash: acme.sh: command not found 错误,需执行 source ~/.bashrc。
2. 生成证书
Acme.sh 支持 ACME 协议的所有验证方式,其中最常用的是 HTTP 验证和 DNS 验证。
- 
HTTP 验证:
- 
直接签发 :
指定域名和网站根目录,Acme.sh 将自动在根目录下生成并删除验证文件,验证过程安全无副作用。bashacme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/ - 
使用 Apache 模式 :
Acme.sh 可以智能地从 Apache 的配置中读取信息,自动完成验证,无须指定网站根目录。bashacme.sh --issue --apache -d example.com -d www.example.com -d cp.example.com - 
使用 Nginx 模式 :
同样,Acme.sh 也能智能地从 Nginx 的配置中读取信息完成验证。bashacme.sh --issue --nginx -d example.com -d www.example.com -d cp.example.com - 
使用独立服务模式 :
如果服务器上没有运行任何 Web 服务,且 80 端口空闲,Acme.sh 可以启动临时 Web 服务来完成验证。bashacme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com - 
修改默认 CA :
若遇到证书申请卡在待处理状态,尝试将 CA 服务器改为 Let's Encrypt。bashacme.sh --set-default-ca --server letsencrypt 
 - 
 - 
DNS 验证:
- 
手动验证 :
若不能通过 Web 服务器自动验证,可手动在域名管理面板添加一条 TXT 记录以验证域名所有权。bashacme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com之后需重新生成证书:
bashacme.sh --renew -d example.com - 
自动验证(DNS API) :
DNS 方式的真正强大之处在于可以使用域名解析商提供的 API 自动添加 TXT 记录,且在完成验证后删除对应的记录。
acme.sh 目前支持超过一百家的 DNS API。
以 Aliyun 为例,获取 API Key 并执行:bashexport Ali_Key="LTAI5**************" export Ali_Secret="SkYA**************"现在我们可以签发通配符证书了:
bash/root/.acme.sh/acme.sh --issue --dns dns_ali -d example.cn -d *.example.cnAli_Key和Ali_Secret将保存在~/.acme.sh/account.conf中,并在需要时自动获取,无需手动再设置。
更详细的 DNS API 用法: https://github.com/acmesh-official/acme.sh/wiki/dnsapi 
 - 
 
3. 安装证书到服务
- 
Apache 示例:
bashacme.sh --install-cert -d example.com \ --cert-file /path/to/certfile/in/apache/cert.pem \ --key-file /path/to/keyfile/in/apache/key.pem \ --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \ --reloadcmd "service apache2 force-reload" - 
Nginx 示例:
bashacme.sh --install-cert -d example.com \ --key-file /path/to/keyfile/in/nginx/key.pem \ --fullchain-file /path/to/fullchain/nginx/cert.pem \ --reloadcmd "service nginx reload" 
Nginx 的配置项 ssl_certificate 需要使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/.cer ,否则 SSL Labs 的测试会报证书链问题(Chain issues Incomplete)。
默认情况下,证书每 60 天更新一次(可自定义)。更新证书后,Apache 或者 Nginx 服务会通过 reloadcmd 传递的命令自动重载配置。
注意:reloadcmd 非常重要。证书会自动申请续签,但是如果没有正确的 reloadcmd 命令,证书可能无法被重新应用到 Apache 或者 Nginx,因为配置没有被重载。
4. 查看已安装证书的信息
利用 Acme.sh 可以轻松查看任何已签发证书的详细信息。
            
            
              bash
              
              
            
          
          acme.sh --info -d example.com
        上述命令将显示证书的配置,包括证书的创建时间、下次续签时间以及用于自动更新服务配置的命令等。
5. 更新证书
证书每 60 天自动更新,无需用户手动操作。不过,也可以使用强制更新命令重新续签证书:
            
            
              bash
              
              
            
          
          acme.sh --renew -d example.com --force
        6. 修改 reloadcmd
修改 reloadcmd 虽然没有专门的命令,但可以通过重新安装证书时指定来实现。此外,证书信息存储在 ~/.acme.sh/example.com/example.conf 文件中,用 Base64 编码保存了 reloadcmd。理论上,可以直接编辑此文件并解码修改,但官方不推荐该方法,因为文件格式可能会变化。
7. 更新 Acme.sh
Acme.sh 持续开发中,为了获得最新的功能和修复,建议定期更新。
- 
手动更新:
bashacme.sh --upgrade - 
自动更新 :
开启自动更新,Acme.sh 将自动保持最新版本。
bashacme.sh --upgrade --auto-upgrade随时关闭自动更新:
bashacme.sh --upgrade --auto-upgrade 0 
8. 出错怎么办?
遇到错误时,可以添加 --debug 参数获取更详细的调试信息,帮助诊断问题所在。
- 
基本调试 :
bashacme.sh --issue ... --debug - 
高级调试 :
bashacme.sh --issue ... --debug 2 
如在 DNS 验证中遇到超时问题,可能是网络环境问题,可以设置 HTTP 或 HTTPS 代理环境变量解决。
            
            
              bash
              
              
            
          
          export http_proxy="socks5h://localhost:1081"
export https_proxy="socks5h://localhost:1081"
        如果遇到更复杂的问题,可以参考官方提供的调试指南:https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
以上是利用 Acme.sh 生成和管理证书的基本指南,但其功能远不止于此,更多高级用法可查看官方文档:https://github.com/acmesh-official/acme.sh/wiki/