Linux 使用 acme.sh 自动申请续签免费 SSL 证书
安装 acme.sh
使用一个普通用户或者 root
用户下载并执行安装脚本:
curl https://get.acme.sh | sh -s email=<email>
<email>
是用于注册 Let's Encrypt 账户的电子邮件(必须),将会收到续订通知电子邮件。
刷新 Bash 配置:
source ~/.bashrc
查看已安装的 acme.sh 的版本号:
acme.sh -v
https://github.com/acmesh-official/acme.sh
v3.1.1
配置 acme.sh
acme.sh 脚本默认 CA 服务器是 ZeroSSL,有时可能会导致获取证书的时候一直出现:Pending,The CA is processing your order,please just wait.
把 CA 服务器改成 Let's Encrypt 可降低出现 pending 概率:
acme.sh --set-default-ca --server letsencrypt
Let’s Encrypt 证书不再支持 OCSP,证书中不再包含 OCSP URI 信息,对应 Apache 或者 nginx 无需再配置 OCSP Stapling。
如果需要使用 OCSP Stapling 功能,可以继续使用或者切换回 ZeroSSL 作为默认 CA 服务器:
acme.sh --set-default-ca --server zerossl
生成证书
生成证书需要验证域名所有权,一般选择 HTTP 验证或者 DNS 验证。
HTTP 验证需要确保需要生成证书的域名已经解析到主机,不支持泛域名。
DNS 验证支持泛域名,需要使用 DNS 服务商的 DNS API 来完成证书的自动申请。
可以配置多个域名共用一张证书,如果同时配置多个域名,生成的证书会以第一个域名来命名。
HTTP 验证
如果域名配置了 Web HTTP 服务(可通过 80 端口正常访问),可以使用 acme.sh 自动生成验证文件,并自动放到网站的根目录,验证完成后会自动删除验证文件:
acme.sh --issue \
-d avinzheng.com \
-d blog.avinzheng.com \
--webroot /var/wwwroot/avinzheng.com/
如果域名没有配置 Web HTTP 服务,可以使用 acme.sh 的独立服务模式(需要先安装 socat
依赖),会自动临时启动一个 Web HTTP 服务来完成验证:
acme.sh --issue \
-d avinzheng.com \
-d blog.avinzheng.com \
--standalone \
--httpport 80
--httpport
为临时启动的 Web HTTP 服务使用的端口,一般为 80 可以省略该配置项,需要确保主机商网络防火墙(如果有)和服务器防火墙均已开放该端口。
DNS 验证
前往 How to use DNS API 找到自己的 DNS 服务商对应的操作和命令。
阿里云:
export Ali_Key="LTAI5tQEHujP3231CacT3g3Tgcsu"
export Ali_Secret="sOEeu9w4Q23WAcXodhY2ShOEpEgs0OuhD"
acme.sh --issue --dns dns_ali -d avinzheng.com -d *.avinzheng.com
阿里云推荐使用 “子用户AccessKey”,然后只给予子用户 “AliyunDNSFullAccess“ 权限。
CloudFlare:
export CF_Token="sdfsddffsdfljlbjkl3jlkjsdfoiwje"
export CF_Account_ID="sgdadskljk4234nk234n23k4n23k4n2l3k42k34nk"
acme.sh --issue --dns dns_cf -d avinzheng.com -d *.avinzheng.com
CF_Account_ID
可在登陆 CloudFlare 后,在顶部导航中点击域名名称,在 Overview
页面右边栏底部 CF Account ID
获取。
复制证书
配置命令权限
如果使用 Apache 或者 nginx 服务,证书更新后重启 Apache 或者 nginx 服务需要 sudo 命令权限,如果 acme.sh 运行用户无 sudo 命令权限,或者执行 sudo 命令时需要密码,需要给用户添加免密码执行重启 Apache 或者 nginx 服务的权限。
编辑 sudo 权限配置文件:
sudo visudo
使用 Apache 插入配置:
<user> ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart apache2
使用 nginx 插入配置:
<user> ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
<user>
为当前用户(默认为 acme.sh 运行的用户)。
复制证书
创建用于保存证书的目录:
sudo mkdir -p /etc/ssl/web
修改目录所有者为当前用户:
sudo chown <user>:<user> /etc/ssl/web
复制证书:
acme.sh --install-cert -d avinzheng.com \
--cert-file /etc/ssl/web/cert.pem \
--key-file /etc/ssl/web/key.pem \
--ca-file /etc/ssl/web/ca.pem \
--fullchain-file /etc/ssl/web/fullchain.pem \
--reloadcmd "sudo systemctl restart nginx"
--reloadcm
命令用于每次复制证书后重启 Apache 或者 nginx 时使用,不同系统或软件会存在差异,Apache 一般为 sudo systemctl restart apache2
。如果不使用 Apache 或者 nginx 可去掉该配置项。
nginx 的配置项 ssl_certificate
使用的是 --fullchain-file
对应的 fullchain.pem
文件 ,
Let’s Encrypt 证书有效期为 90 天,目前在 60 天后,acme.sh 会自动续签证书,自动复制证书,自动执行 --reloadcmd
中的命令。
命令测试
测试自动更新证书命令是否可以成功执行:
acme.sh --renew -d avinzheng.com --force
管理 acme.sh
续签证书
强制续签指定域名证书:
acme.sh --renew -d <domain> --force
强制续签所有域名证书:
acme.sh --renew-all --force
升级 acme.sh
# 手动升级 acme.sh
acme.sh --upgrade
# 开启 acme.sh 自动升级
acme.sh --upgrade --auto-upgrade
# 关闭 acme.sh 自动升级
acme.sh --upgrade --auto-upgrade 0
卸载 acme.sh
acme.sh --uninstall