使用acme.sh为阿里云DNS域名申请Let'sEncrypt通配符证书(Ubuntu+Nginx)
发表于更新于
阅读量: 永康
适用于:
- 操作系统:Ubuntu
- Web 服务器:Nginx
- 域名:
zhu2.net、lyii.net
- DNS 托管:阿里云云解析 DNS
- 证书类型:Let’s Encrypt 通配符证书(Wildcard Certificate)
千问生成,已测试
一、准备工作:获取阿里云 AccessKey
- 登录 阿里云 RAM 控制台
- 创建子用户(如
acme-user),启用 编程访问
- 授权策略:添加
AliyunDNSFullAccess(或自定义最小权限)
- 记录:
- AccessKey ID
- AccessKey Secret
⚠️ 安全建议:不要使用主账号 AK,仅授予 DNS 管理权限。
二、安装 acme.sh(从 Gitee 克隆)
1 2 3 4 5 6 7 8 9 10
| sudo apt update sudo apt install -y curl git socat
git clone https://gitee.com/neilpang/acme.sh.git cd acme.sh
./acme.sh --install -m your-email@example.com
|
✅ 替换 your-email@example.com 为你的邮箱(用于证书过期通知)
安装后,acme.sh 命令将全局可用,实际脚本位于 ~/.acme.sh/acme.sh
三、配置阿里云 DNS API 凭据
1 2 3
| export Ali_Key="你的_AccessKey_ID" export Ali_Secret="你的_AccessKey_Secret"
|
凭据将被保存在 ~/.acme.sh/account.conf 中,后续无需重复设置。
四、申请通配符证书
1 2 3 4 5 6 7
| ~/.acme.sh/acme.sh --issue --dns dns_ali \ -d zhu2.net -d '*.zhu2.net'
~/.acme.sh/acme.sh --issue --dns dns_ali \ -d lyii.net -d '*.lyii.net'
|
✅ 成功后,证书临时存于 ~/.acme.sh/zhu2.net/ 和 ~/.acme.sh/lyii.net/
但不要直接使用这些路径! 下一步将安装到标准目录。
五、将证书安装到 Nginx 目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| sudo mkdir -p /etc/nginx/ssl/{zhu2.net,lyii.net}
~/.acme.sh/acme.sh --install-cert -d zhu2.net -d '*.zhu2.net' \ --key-file /etc/nginx/ssl/zhu2.net/privkey.pem \ --fullchain-file /etc/nginx/ssl/zhu2.net/fullchain.pem \ --reloadcmd "sudo systemctl reload nginx"
~/.acme.sh/acme.sh --install-cert -d lyii.net -d '*.lyii.net' \ --key-file /etc/nginx/ssl/lyii.net/privkey.pem \ --fullchain-file /etc/nginx/ssl/lyii.net/fullchain.pem \ --reloadcmd "sudo systemctl reload nginx"
|
✅ --reloadcmd 确保每次续期后自动重载 Nginx,无需手动干预。
六、配置 Nginx
1. 配置 zhu2.net
1
| sudo nano /etc/nginx/sites-available/zhu2.net
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| server { listen 80; server_name zhu2.net *.zhu2.net; return 301 https://$host$request_uri; }
server { listen 443 ssl http2; server_name zhu2.net *.zhu2.net;
ssl_certificate /etc/nginx/ssl/zhu2.net/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/zhu2.net/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE+AESGCM:DHE+AESGCM:AES256+EECDH:AES256+EDH; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
root /var/www/zhu2.net; index index.html; location / { try_files $uri $uri/ =404; } }
|
2. 配置 lyii.net
1
| sudo nano /etc/nginx/sites-available/lyii.net
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| server { listen 80; server_name lyii.net *.lyii.net; return 301 https://$host$request_uri; }
server { listen 443 ssl http2; server_name lyii.net *.lyii.net;
ssl_certificate /etc/nginx/ssl/lyii.net/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/lyii.net/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE+AESGCM:DHE+AESGCM:AES256+EECDH:AES256+EDH; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
root /var/www/lyii.net; index index.html; location / { try_files $uri $uri/ =404; } }
|
3. 启用站点并重载 Nginx
1 2 3 4 5 6 7 8 9
| sudo ln -s /etc/nginx/sites-available/zhu2.net /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/lyii.net /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
|
七、自动续期(已自动配置)
acme.sh 在安装时已自动添加 cron 任务,每天检查证书是否需要续期。
验证 cron 是否存在:
1
| crontab -l | grep acme.sh
|
应看到类似输出:
1
| 43 0 * * * "/home/ubuntu/.acme.sh"/acme.sh --cron --home "/home/ubuntu/.acme.sh" > /dev/null
|
✅ 续期成功后,会自动执行 --reloadcmd 重载 Nginx。
你也可以手动测试续期(不会真正续,仅模拟):
1
| ~/.acme.sh/acme.sh --cron --force
|
八、验证 HTTPS
- 访问
https://test.zhu2.net
- 访问
https://api.lyii.net
- 浏览器应显示安全锁,无证书错误
- 可使用 SSL Labs 测试 检查配置安全性
附录:安全建议
- 限制 AccessKey 权限:仅允许操作 DNS 记录(
AddDomainRecord, DeleteDomainRecord, DescribeDomainRecords)
- 保护凭据文件:
~/.acme.sh/account.conf 包含敏感信息,请勿泄露
- 定期更新 acme.sh:支持自动升级,也可手动运行
~/.acme.sh/acme.sh --upgrade
📌 本文档基于 acme.sh 从 Gitee 安装,适用于中国大陆网络环境。
如需支持其他 DNS 服务商(如腾讯云、华为云、DNSPod),acme.sh 也提供对应插件。
✅ 完成!你的网站现在已启用免费、自动续期的 Let’s Encrypt 通配符 HTTPS 证书。