使用 acme.sh 配置 ssl 证书

本文简单记录使用 acme.sh 工具配置 SSL 证书的步骤 (使用 nginx 模式进行验证, 需要其他模式另行参考 acme.sh 官方文档)

以下使用 example.com 作为示例域名

curl https://get.acme.sh | sh -s email=my@example.com
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
~/.acme.sh/acme.sh --issue --nginx -d example.com

会在~/.acme.sh/example.com_ecc/目录下生成四个文件:

  • example.com.cer:域名证书
  • example.com.key:私钥
  • ca.cer:中间CA证书
  • fullchain.cer:证书链文件 (包含域名证书和CA证书)
~/.acme.sh/acme.sh --install-cert -d example.com --ecc \
  --key-file /etc/nginx/ssl/example.com/privkey.pem \
  --fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \
  --reloadcmd "sudo systemctl reload nginx"

这一步做了两件事:

  • 将生成的证书文件复制到指定目录 (其中 /etc/nginx/ssl/example.com 路径可以更换为任意目录)
  • 该命令会作为 “安装规则”, 每次在 crontab 中触发证书续期后执行同样的命令
server {
    listen 80;
    listen [::]:80;
    server_name example.com;
 
    return 301 https://$host$request_uri;
}
 
server {
    listen        443 ssl http2;
    listen        [::]:443 ssl http2;
 
    server_name    example.com
 
    ssl_certificate         /etc/nginx/ssl/example.com/fullchain.pem;
    ssl_certificate_key     /etc/nginx/ssl/example.com/privkey.pem;
 
    # ... other configuration ...
}
  1. 检查配置 nginx -t,
  2. 重载 systemctl reload nginx
crontab -l

能看到类似以下的输出 (定时逻辑和脚本路径根据实际情况可能有所不同)

0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

Reference