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,导致找不到之前在普通用户下申请的证书。
正确方案:
先修改目标目录的所有者为当前用户:
sudo chown -R yanchang:yanchang /etc/nginx/ssl执行安装命令(不带 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,说明必须配置免密。如果没有报错,说明你以前配置过,那就没问题。
第二步:配置免密 (如果上面报错了)
编辑权限文件:
Bash
sudo visudo在文件最后添加这一行(确保路径正确):
Plaintext
yanchang ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx保存退出 (
Ctrl+O,Enter,Ctrl+Xfor nano;:wqfor 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 算法更轻量、更安全)。对于拥有多个子域名的个人开发者来说,这套方案堪称“一劳永逸”。