yanchang
yanchang
发布于 2026-02-12 / 21 阅读
0
0

实战:使用 acme.sh 自动化部署 ZeroSSL 免费泛域名证书

0. 碎碎念

最近在为我的 Home Server 部署多个子域名服务时,发现传统的单域名证书管理起来非常繁琐。为了实现“一次配置,全域通用”,我决定申请 泛域名证书 (Wildcard Certificate)。本文记录了使用 acme.sh 配合阿里云 DNS API 申请 ZeroSSL 泛域名证书的全过程。

1. 准备工作

  • 域名yanchang.cc(托管在阿里云 DNS)

  • 环境:Ubuntu / Debian (Home Server)

  • 工具acme.sh

  • 目标:同时保护 yanchang.cc*.yanchang.cc

2. 申请流程

2.1 获取 API 凭证

登录阿里云 RAM 控制台,创建 API 密钥(AccessKey),并授予 AliyunDNSFullAccess 权限。

2.2 安装 acme.sh

Bash

curl https://get.acme.sh | sh -s email=your@email.com
source ~/.bashrc

2.3 导入环境变量并申请

泛域名证书必须使用 DNS 验证。acme.sh 现在默认使用 ZeroSSL。

Bash

export Ali_Key="LTAl5xxxxxxxxxxxx"
export Ali_Secret="xxxxxxxxx"

# 同时申请根域名和泛域名
acme.sh --issue --dns dns_ali -d yanchang.cc -d *.yanchang.cc

注:申请过程中由于国内网络连接 ZeroSSL 的 API 可能出现超时(Error 28),脚本会自动重试,无须担心。

3. 自动化部署与避坑指南

3.1 遇到的权限坑

在执行安装命令时,直接向 /etc/nginx/ssl 写入文件会报 权限不够

错误尝试:使用 sudo acme.sh风险:这会改变脚本的家目录指向 /root,导致找不到之前在普通用户下申请的证书。

正确方案

  1. 先修改目标目录的所有者为当前用户: sudo chown -R yanchang:yanchang /etc/nginx/ssl

  2. 执行安装命令(不带 sudo,但 reloadcmd 内部带 sudo):

Bash

acme.sh --install-cert -d yanchang.cc \
--key-file       /etc/nginx/ssl/www.yanchang.key  \
--fullchain-file /etc/nginx/ssl/www.yanchang.pem \
--reloadcmd     "sudo systemctl reload nginx"

这样操作后,acme.sh 会记住这个配置,未来自动续期时会以当前用户身份写入文件,并安全地重载 Nginx。

为了防止 2 个月后证书续签失败,请现在就执行以下操作来修复权限:

第一步:验证当前是否需要密码 在终端执行:

Bash

sudo -n systemctl reload nginx
  • 如果有报错说 sudo: a password is required,说明必须配置免密

  • 如果没有报错,说明你以前配置过,那就没问题。

第二步:配置免密 (如果上面报错了)

  1. 编辑权限文件:

    Bash

    sudo visudo
    
  2. 在文件最后添加这一行(确保路径正确):

    Plaintext

    yanchang ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx
    
  3. 保存退出 (Ctrl+O, Enter, Ctrl+X for nano; :wq for vim)。

第三步:再次验证 再次执行 sudo -n systemctl reload nginx。如果这次没有报错直接执行成功,那就彻底配置好了。


日志在哪里?

如果未来你发现证书没更新,或者想看看它每天晚上 10:49 到底干了什么,可以查看日志:

Bash

tail -f ~/.acme.sh/acme.sh.log

这个文件记录了每次 API 调用的详细过程。

4. 验证结果

使用 OpenSSL 检查证书的 Subject Alternative Name (SAN) 字段:

Bash

openssl x509 -in /etc/nginx/ssl/www.yanchang.pem -text -noout | grep "DNS"

输出DNS:yanchang.cc, DNS:*.yanchang.cc。验证成功!

5. Nginx 配置建议

现在所有的子域名都可以复用同一套证书文件:

Nginx

server {
    listen 443 ssl http2;
    server_name blog.yanchang.cc;

    ssl_certificate     /etc/nginx/ssl/www.yanchang.pem;
    ssl_certificate_key /etc/nginx/ssl/www.yanchang.key;
    
    # ECC 证书建议配置 TLS 1.2+
    ssl_protocols TLSv1.2 TLSv1.3;
    # ...
}

6. 总结

通过 acme.sh 配合 DNS API,我们不仅省去了每年上千元的泛域名证书费用,还实现了证书的自动续期(ECC 算法更轻量、更安全)。对于拥有多个子域名的个人开发者来说,这套方案堪称“一劳永逸”。


评论