全栈技术

acme.sh 免费 SSL 证书安装与自动化管理完整指南

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域名,多个域名可重复添加
-wWeb 根目录,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_SecretWiki
腾讯云腾讯云密钥Wiki
GoDaddyGD_Key / GD_SecretWiki

三、部署证书到 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/...

排查步骤

  1. 确认 Web 根目录路径是否正确
  2. 检查文件权限:ls -la /var/www/html/.well-known/acme-challenge/
  3. 确认防火墙/安全组已开放 80 端口
  4. 手动访问验证 URL,确认文件可被访问

❌ 自动续期后网站无法访问

可能原因--reloadcmd 命令执行失败

排查步骤

  1. 查看 Cron 日志:grep acme.sh /var/log/cron
  2. 手动执行 reloadcmd 测试:systemctl reload nginx
  3. 确认证书文件路径是否存在:ls -la /etc/nginx/ssl/example.com/

❌ DNS 验证失败

可能原因:API Token 权限不足或环境变量未正确加载

排查步骤

  1. 确认 API Token 具备编辑 DNS 记录的权限
  2. 对于手动 DNS 模式,可使用 --dns dns_manual 并手动添加 TXT 记录

📋 安全建议

  1. 保护私钥:将私钥文件权限设置为 600,仅管理员可读写

    chmod 600 /etc/nginx/ssl/example.com/key.pem
    
  2. 定期备份:证书续期操作不可逆,建议定期备份整个 SSL 目录

    tar -czvf ssl-backup.tar.gz /etc/nginx/ssl
    
  3. 启用 HSTS(可选):在 Nginx/Apache 配置中添加严格传输安全头


✅ 总结

通过本文,你已掌握:

  • ✅ 安装并配置 acme.sh
  • ✅ 使用 HTTP 和 DNS 两种方式申请证书
  • ✅ 将证书部署到 Nginx 和 Apache
  • ✅ 配置自动续期与故障排查

🎉 按照以上步骤操作,即可实现证书的零手动管理,永久免费 HTTPS!

评论

2
  • 梁琪清

    请问,acme.sh会自动续证书吗?

    小叶子(AI)

    您好!是的,acme.sh 安装后会自动创建定时任务(Cron Job),默认每天凌晨 0 点检查证书是否需要续期,无需手动干预。

    您可以通过以下命令查看自动续期任务是否已配置:

    crontab -l | grep acme.sh
    

    如果未找到,可手动添加定时任务(文章第二部分第 3 点有详细说明)。首次部署后建议用 acme.sh --cron --force 手动测试一次续期流程,确保一切正常。

    如有其他问题欢迎继续提问!😊

  • 992795803

    通过本文,我已掌握: ✅ 安装并配置 acme.sh ✅ 使用 HTTP 和 DNS 两种方式申请证书 ✅ 将证书部署到 Nginx 和 Apache ✅ 配置自动续期与故障排查

    小叶子(AI)

    感谢您的认真阅读和反馈!🎉 很高兴本文能帮助您顺利完成 acme.sh 的配置与证书管理。如果后续在使用过程中遇到任何问题,欢迎随时留言交流~

登录 后发表评论。