使用 Acme.sh 自动生成和续签免费 SSL 证书(含通配符支持)

Acme.sh 是一个开源的脚本,能够从 ZeroSSLLet's Encrypt 等证书颁发机构(CA)获取免费的 HTTPS 证书。该脚本特别简单易用,并且支持多种验证方式。下面将详细介绍使用 Acme.sh 生成、安装和更新证书的各个步骤。
Github地址
使用说明

1. 安装 Acme.sh

安装 Acme.sh 可以通过简单的命令实现,并且不限制于 root 用户。普通用户也能顺利完成安装。

  • 命令安装需要服务器能正常访问github

    bash 复制代码
    curl https://get.acme.sh | sh -s email=my@example.com

    bash 复制代码
    wget -O -  https://get.acme.sh | sh -s email=my@example.com
  • 从 GitHub 安装

    bash 复制代码
    curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m  my@example.com

    bash 复制代码
    wget -O -  https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m  my@example.com
  • git clone 并安装(推荐)

    bash 复制代码
    git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
    cd acme.sh
    ./acme.sh --install -m my@example.com
  • 高级安装

    bash 复制代码
    git 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 将自动在根目录下生成并删除验证文件,验证过程安全无副作用。

      bash 复制代码
      acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
    • 使用 Apache 模式
      Acme.sh 可以智能地从 Apache 的配置中读取信息,自动完成验证,无须指定网站根目录。

      bash 复制代码
      acme.sh --issue --apache -d example.com -d www.example.com -d cp.example.com
    • 使用 Nginx 模式
      同样,Acme.sh 也能智能地从 Nginx 的配置中读取信息完成验证。

      bash 复制代码
      acme.sh --issue --nginx -d example.com -d www.example.com -d cp.example.com
    • 使用独立服务模式
      如果服务器上没有运行任何 Web 服务,且 80 端口空闲,Acme.sh 可以启动临时 Web 服务来完成验证。

      bash 复制代码
      acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
    • 修改默认 CA
      若遇到证书申请卡在待处理状态,尝试将 CA 服务器改为 Let's Encrypt。

      bash 复制代码
      acme.sh --set-default-ca --server letsencrypt
  • DNS 验证

    • 手动验证
      若不能通过 Web 服务器自动验证,可手动在域名管理面板添加一条 TXT 记录以验证域名所有权。

      bash 复制代码
      acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com

      之后需重新生成证书:

      bash 复制代码
      acme.sh --renew -d example.com
    • 自动验证(DNS API)
      DNS 方式的真正强大之处在于可以使用域名解析商提供的 API 自动添加 TXT 记录,且在完成验证后删除对应的记录。
      acme.sh 目前支持超过一百家的 DNS API。
      Aliyun 为例,获取 API Key 并执行:

      bash 复制代码
      export Ali_Key="LTAI5**************"
      export Ali_Secret="SkYA**************"

      现在我们可以签发通配符证书了:

      bash 复制代码
      /root/.acme.sh/acme.sh --issue --dns dns_ali -d example.cn -d *.example.cn

      Ali_KeyAli_Secret将保存在 ~/.acme.sh/account.conf 中,并在需要时自动获取,无需手动再设置。
      更详细的 DNS API 用法: https://github.com/acmesh-official/acme.sh/wiki/dnsapi

3. 安装证书到服务
  • Apache 示例

    bash 复制代码
    acme.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 示例

    bash 复制代码
    acme.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 持续开发中,为了获得最新的功能和修复,建议定期更新。

  • 手动更新

    bash 复制代码
    acme.sh --upgrade
  • 自动更新

    开启自动更新,Acme.sh 将自动保持最新版本。

    bash 复制代码
    acme.sh --upgrade --auto-upgrade

    随时关闭自动更新:

    bash 复制代码
    acme.sh --upgrade --auto-upgrade 0
8. 出错怎么办?

遇到错误时,可以添加 --debug 参数获取更详细的调试信息,帮助诊断问题所在。

  • 基本调试

    bash 复制代码
    acme.sh --issue ... --debug
  • 高级调试

    bash 复制代码
    acme.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/

相关推荐
幽兰的天空5 小时前
介绍 HTTP 请求如何实现跨域
网络·网络协议·http
lisenustc5 小时前
HTTP post请求工具类
网络·网络协议·http
心平气和️5 小时前
HTTP 配置与应用(不同网段)
网络·网络协议·计算机网络·http
心平气和️5 小时前
HTTP 配置与应用(局域网)
网络·计算机网络·http·智能路由器
初级代码游戏5 小时前
openssl 正确生成v3带SAN的证书
https·证书·ssl·openssl·tls·v3
Gworg5 小时前
网站HTTP改成HTTPS
网络协议·http·https
Mbblovey6 小时前
Picsart美易照片编辑器和视频编辑器
网络·windows·软件构建·需求分析·软件需求
北顾南栀倾寒7 小时前
[Qt]系统相关-网络编程-TCP、UDP、HTTP协议
开发语言·网络·c++·qt·tcp/ip·http·udp
GZ_TOGOGO7 小时前
PIM原理与配置
网络·华为·智能路由器
7ACE7 小时前
Wireshark TS | 虚假的 TCP Spurious Retransmission
网络·网络协议·tcp/ip·wireshark·tcpdump