acme.sh 免费 SSL 证书安装与自动化管理完整指南
🔐 本文详细介绍如何使用开源工具
acme.sh申请、部署并自动管理 Let's Encrypt SSL 证书,适用于 Nginx、Apache 及各类 DNS 服务商。
一、安装 acme.sh
1. 下载并安装
curl https://get.acme.sh | sh -s email=your-email@example.com
- 将
your-email@example.com替换为你的真实邮箱(用于接收证书到期提醒) - 安装完成后,脚本会自动创建
~/.acme.sh目录并注册acme.sh命令别名
2. 激活 acme.sh
source ~/.bashrc # 如果使用 Bash
source ~/.zshrc # 如果使用 Zsh
💡 验证安装:运行
acme.sh --version确认版本信息。
3. 配置自动续期
安装脚本会自动创建定时任务(Cron Job),可通过以下命令检查:
crontab -l | grep acme.sh
如果未找到,可手动添加:
0 0 * * * /root/.acme.sh/acme.sh --cron --home "/root/.acme.sh"
⚠️ 默认每天凌晨 0 点检查证书是否需要续期。
二、申请 SSL 证书
方法一:HTTP 验证(适合已有 Web 服务)
需要服务器 80 端口已开放,且 Web 根目录可被 Let's Encrypt 访问。
acme.sh --issue -d example.com -d www.example.com -w /var/www/html
| 参数 | 说明 |
|---|---|
-d | 域名,多个域名可重复添加 |
-w | Web 根目录,acme.sh 会在此目录下创建验证文件 |
💡 前提条件:确保
/var/www/html权限正确,且可通过http://example.com/.well-known/acme-challenge/访问。chmod -R 755 /var/www/html
方法二:DNS 验证(适合无 Web 服务或通配符证书)
此方法无需开放服务器端口,通过 DNS API 自动完成验证。
Cloudflare 示例
export CF_Token="your-cloudflare-api-token"
export CF_Account_ID="your-cloudflare-account-id"
acme.sh --issue --dns dns_cf -d example.com -d *.example.com
💡 提示:上述命令中的
dns_cf即表示使用 Cloudflare DNS API,*.example.com可申请通配符证书。
其他 DNS 服务商
| 服务商 | 环境变量 | 文档参考 |
|---|---|---|
| 阿里云 | Ali_Key / Ali_Secret | Wiki |
| 腾讯云 | 腾讯云密钥 | Wiki |
| GoDaddy | GD_Key / GD_Secret | Wiki |
三、部署证书到 Web 服务器
1. 创建证书存储目录
mkdir -p /etc/nginx/ssl/example.com
chmod 700 /etc/nginx/ssl # 仅 root 可访问
2. 安装证书
acme.sh --install-cert -d example.com \
--cert-file /etc/nginx/ssl/example.com/cert.pem \
--key-file /etc/nginx/ssl/example.com/key.pem \
--fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \
--reloadcmd "systemctl reload nginx"
⚠️
--reloadcmd用于证书续期后自动重载 Web 服务,请根据实际情况修改(如 Apache 使用systemctl reload apache2)。
3. 配置 Web 服务器
Nginx 配置示例
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/key.pem;
# 推荐 SSL 配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /var/www/html;
index index.html;
}
Apache 配置示例
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
SSLEngine on
SSLCertificateFile /etc/nginx/ssl/example.com/fullchain.pem
SSLCertificateKeyFile /etc/nginx/ssl/example.com/key.pem
DocumentRoot /var/www/html
</VirtualHost>
4. 重启 Web 服务使配置生效
# Nginx
systemctl restart nginx
# Apache
systemctl restart apache2
四、验证与维护
1. 检查证书信息
openssl x509 -in /etc/nginx/ssl/example.com/fullchain.pem -noout -dates
预期输出:
notBefore=Jan 1 00:00:00 2024 GMT
notAfter=Apr 1 00:00:00 2024 GMT
2. 测试自动续期(手动触发)
acme.sh --cron --force
💡 首次测试建议使用
--force强制续期,观察是否一切正常。
3. 更新 acme.sh
acme.sh --upgrade
⚠️ 建议定期执行,或订阅官方更新通知。
五、常见问题
❌ 证书生成失败
错误提示:Verify error: Invalid response from http://example.com/.well-known/acme-challenge/...
排查步骤:
- 确认 Web 根目录路径是否正确
- 检查文件权限:
ls -la /var/www/html/.well-known/acme-challenge/ - 确认防火墙/安全组已开放 80 端口
- 手动访问验证 URL,确认文件可被访问
❌ 自动续期后网站无法访问
可能原因:--reloadcmd 命令执行失败
排查步骤:
- 查看 Cron 日志:
grep acme.sh /var/log/cron - 手动执行 reloadcmd 测试:
systemctl reload nginx - 确认证书文件路径是否存在:
ls -la /etc/nginx/ssl/example.com/
❌ DNS 验证失败
可能原因:API Token 权限不足或环境变量未正确加载
排查步骤:
- 确认 API Token 具备编辑 DNS 记录的权限
- 对于手动 DNS 模式,可使用
--dns dns_manual并手动添加 TXT 记录
📋 安全建议
-
保护私钥:将私钥文件权限设置为 600,仅管理员可读写
chmod 600 /etc/nginx/ssl/example.com/key.pem -
定期备份:证书续期操作不可逆,建议定期备份整个 SSL 目录
tar -czvf ssl-backup.tar.gz /etc/nginx/ssl -
启用 HSTS(可选):在 Nginx/Apache 配置中添加严格传输安全头
✅ 总结
通过本文,你已掌握:
- ✅ 安装并配置 acme.sh
- ✅ 使用 HTTP 和 DNS 两种方式申请证书
- ✅ 将证书部署到 Nginx 和 Apache
- ✅ 配置自动续期与故障排查
🎉 按照以上步骤操作,即可实现证书的零手动管理,永久免费 HTTPS!
评论
梁琪清小叶子(AI) 9992795803 小叶子(AI)
请 登录 后发表评论。请问,acme.sh会自动续证书吗?
您好!是的,acme.sh 安装后会自动创建定时任务(Cron Job),默认每天凌晨 0 点检查证书是否需要续期,无需手动干预。
您可以通过以下命令查看自动续期任务是否已配置:
如果未找到,可手动添加定时任务(文章第二部分第 3 点有详细说明)。首次部署后建议用
acme.sh --cron --force手动测试一次续期流程,确保一切正常。如有其他问题欢迎继续提问!😊
通过本文,我已掌握: ✅ 安装并配置 acme.sh ✅ 使用 HTTP 和 DNS 两种方式申请证书 ✅ 将证书部署到 Nginx 和 Apache ✅ 配置自动续期与故障排查
感谢您的认真阅读和反馈!🎉 很高兴本文能帮助您顺利完成 acme.sh 的配置与证书管理。如果后续在使用过程中遇到任何问题,欢迎随时留言交流~