acme.sh:用 Shell 脚本搞定 SSL 证书申请和续期

acme.sh:用 Shell 脚本搞定 SSL 证书申请和续期

文章目录

  • acme.sh:用 Shell 脚本搞定 SSL 证书申请和续期
    • 为什么需要它
    • 支持哪些 CA 和验证方式
    • 安装和使用
    • 跨平台和兼容性
    • 实际使用场景

acme.sh:用 Shell 脚本搞定 SSL 证书申请和续期

acme.sh 在 GitHub 上已经拿到 47K Star 了。

这个项目做的事情很明确——用纯 Shell 脚本实现 ACME 协议,自动申请和续期 SSL 证书。不需要 Python,不需要 Node,一个 Shell 脚本就够了。

为什么需要它

做过 HTTPS 部署的人都知道,证书这件事说简单也简单,说麻烦也麻烦。Let’s Encrypt 提供免费证书,但申请流程要走 ACME 协议,续期要定时跑,多域名、通配符证书的配置各有讲究。手动操作容易忘,过期了网站就挂。

acme.sh 把这套流程封装成一个 Shell 脚本。装好之后,证书申请、续期、安装到 Nginx 或 Apache,全自动化。默认 30 天续期一次,还支持 RFC 9773 的 ARI 续期建议机制,CA 那边说什么时候该换,脚本自己会跟着调整。

支持哪些 CA 和验证方式

默认用 ZeroSSL,也支持 Let’s Encrypt、SSL.com、Google Public CA、Actalis,以及任何符合 RFC 8555 标准的 CA。

验证方式有好几种:

  • Webroot 模式:用现有网站目录验证
  • Standalone 模式:脚本自己起一个 HTTP 服务在 80 端口
  • TLS-ALPN 模式:走 443 端口验证
  • Apache/Nginx 模式:直接对接 Web 服务器做验证
  • DNS 模式:通过 DNS TXT 记录验证,支持通配符证书
  • DNS Persist 模式:放一条长期 TXT 记录,后续续期不用再改 DNS

大部分 DNS 服务商都有 API 集成,Cloudflare、阿里云、腾讯云这些常见的都覆盖了。没有 API 的也能手动加 TXT 记录,只是续期时得再操作一次。

安装和使用

安装就一行:

curlhttps://get.acme.sh|sh-semail=my@example.com

装完之后自动配好 cron 任务,每天检查一次是否需要续期。

申请单域名证书:

acme.sh--issue-dexample.com-w/var/www/html

多域名或通配符:

acme.sh--issue-dexample.com-d'*.example.com'--dnsdns_cf

申请完把证书装到 Nginx:

acme.sh --install-cert-dexample.com\--key-file /etc/nginx/key.pem\--fullchain-file /etc/nginx/cert.pem\--reloadcmd"service nginx force-reload"

续期后会自动执行 reloadcmd,不用手动重启服务。

跨平台和兼容性

acme.sh 在测试矩阵里覆盖了二十多个平台:各种 Linux 发行版、macOS、FreeBSD、OpenBSD、NetBSD、Solaris、Windows(通过 Cygwin),甚至 Haiku OS 和 OpenWRT。Shell 层面兼容 Bash、dash、sh。

不需要 root 权限就能运行,证书放在用户目录下。Docker 也能用,官方提供了镜像。

实际使用场景

acme.sh 被 FreeBSD.org、Proxmox、pfsense、discourse.org 这些项目用在生产环境里。一个 Shell 脚本能跑这么多年、覆盖这么多平台,靠的不是花哨的功能,就是把证书管理这件事做扎实了。

对于个人站长或小团队,装一次就不用管了。对于运维批量管理多台服务器的场景,Shell 脚本的优势在于部署简单,不需要额外的运行时依赖。

扎实了。

对于个人站长或小团队,装一次就不用管了。对于运维批量管理多台服务器的场景,Shell 脚本的优势在于部署简单,不需要额外的运行时依赖。