用 acme.sh 给网站签发 Let's Encrypt 证书
发布时间:2026-09-09 22:34       
更新时间:2026-09-10 01:01
给网站配 HTTPS,签发证书这一步用 acme.sh 会省不少事。它是基于 ACME(自动化证书管理环境协议)的命令行脚本,支持 Let's Encrypt 这类免费证书颁发机构,签发、续期都能一条命令搞定,社区活跃,坑也少。
准备条件
一台能通过 80 端口访问的服务器,域名已解析到服务器 IP,Nginx 已装好且有站点目录(下文以 /var/www/html 为例)。解析对不对先用命令确认,dig +short example.com 的返回应该是本机 IP,不一致就先改解析,否则签发环节的归属校验一定失败。系统需要有 curl 和 cron,CentOS 与 Ubuntu 默认都有。
安装与签发
root 下执行:
curl https://get.acme.sh | sh -s email=admin@example.com
脚本会装到 ~/.acme.sh 目录,并自动写入一条 cron 任务,续期从此不用人管。第一次操作不熟可以加 --test 参数走测试环境,测试证书浏览器不认,但能练完整流程,也不占正式签发的配额。
webroot 方式适合已在运行的 Nginx:验证文件写进站点目录,通过 http://域名/.well-known/ 路径完成校验,全程不用停服务。
acme.sh --issue -d example.com -d www.example.com -w /var/www/html
多域名就多写几个 -d,签出来的是 SAN 证书(一张证书携带多个域名),www 和裸域要一起写进清单,漏了哪个,哪个就在浏览器里报证书不匹配。不确定证书覆盖了哪些域名,用 acme.sh --info -d example.com 一次看清域名清单和有效期。
安装证书到 Nginx
不要让 Nginx 直接引用 .acme.sh 目录里的原始文件,用 --install-cert 拷到固定路径:
acme.sh --install-cert -d example.com \
--fullchain-file /etc/nginx/ssl/example.com.crt \
--key-file /etc/nginx/ssl/example.com.key \
--reloadcmd "nginx -s reload"
reloadcmd 会在每次续期成功后自动执行,Nginx 配置里引用上面两个路径即可。私钥记得收紧权限到 600,同机其他账号不该读到它。
验证与常见报错
浏览器打开 https://example.com 看证书生效,或者用命令读有效期:
openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
签发失败先翻 ~/.acme.sh/example.com/example.com.log,常见三类原因:域名没解析到本机;80 端口被防火墙或安全组挡住;验证期间 Nginx 把 .well-known 路径重定向或拒绝了。卡在 Pending 状态多半是第三种,按日志对症处理后再签。刚配完浏览器侧可能还显示旧证书,那是缓存没过期,换无痕窗口确认,别误判成自己配错。