现代的浏览器开始有将 https 访问作为默认访问方式的倾向,因此需要将网站配置为https 访问。
Let’s Encrypt 组织提供免费的 TLS 加密证书,用于协助web服务器实现https协议。而 acme.sh 脚本便是可以实现从 Let’s Encrypt 自动化申请、续期 TLS 证书的强力工具。
永久链接:http://blog.ryjer.com/posts/a1993e0126.html
Debian 10、OMV 5、CentOS、RHEL、Rocky和 SUSE 等服务器linux 发行版都适用。
使用 acme.sh 脚本为 web服务器(Nginx)申请 ECC TLS 证书,实现网站的 https 加密访问。
github acme.sh官方文档
安装很简单, 一个命令。注意更改最后的[email protected]
为你自己的邮箱
curl https://get.acme.sh | sh -s email=[email protected]
官网的文档上说会自动创建一个 alias,但我这里没有效果。所以手动创建一个,运行以下命令:
alias acme.sh=~/.acme.sh/acme.sh
安装过程也会同时创建一个 cron 定时任务
,可以使用 crontab -l
命令查看,会多出来如下的一行(通常分钟数是随机的)
32 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
上面这个表示在每天 0:32 执行一次
2021-08-07 更新
acme.sh 官方宣布将在 2021-08-01 后将默认CA 证书申请机构从 Let’s Encrypt 转变为 ZeroSSL(估计是被收购了)。详情见 Change default CA to ZeroSSL · acmesh-official/acme.sh Wiki (github.com)
ZeroSSL 也可以申请免费的 90天证书并自动续签,但是需要注册 ZeroSSL 账号后才能使用。但是公告了提供了继续保持原有 CA 机构为 Let’s Encrypt 的方法,使用以下命令将默认CA (证书颁发机构)改为 Let’s Encrypt,且 acme 自动升级后仍将保存该默认设置
acme.sh --set-default-ca --server letsencrypt
如果你想改用 ZeroSSL的话,请参考这篇官方文档: ZeroSSL.com CA · acmesh-official/acme.sh Wiki (github.com)
注意,这需要你去注册一个 ZeroSSL 的账户,注册使用是免费的
如果你不想手动升级, 可以开启自动升级,这样以后就不用再管了
acme.sh --upgrade --auto-upgrade
你也可以随时关闭自动更新
acme.sh --upgrade --auto-upgrade 0
家用宽带是没有80端口的,所以选择使用 DNS服务商(我是阿里) 提供的 API 进行自动添加记录验证的方式申请。
其他的DNS服务商可以参考这个页面 github acme.sh 官方dnsapi 参考文档
下面的是阿里云DNS的环境变量,值是我胡乱打的,注意改为你的值
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
然后,就可以使用以下命令申请域名了。这里假定域名是 domain.com
。这里第二个 -d 参数为 *.domain.com
,表示申请一个泛域名证书(没错,这两个域名只会生成一个证书)。默认会申请 RSA算法 证书,我这里用 -k ec-384
参数改为申请 384位 的 ECC算法 证书。
acme.sh --issue --dns dns_ali -d domain.com -d *.domain.com -k ec-384
生成的证书会存放在当前用户的 ~/.acme.sh
文件夹内。由于acme.sh 脚本会不断更新,该文件夹内的布局也会不断改变。显然直接从该文件夹内拷贝证书出来是一种很不可靠的行为,因为你无法确定下一次证书所在的具体路径。
因此,acme.sh专门提供了复制/安装证书的方法,并且不建议用户直接去 ~/.acme.sh 文件夹内复制证书使用。
根据不同的web服务器,有不同的命令。最为常见的服务器是 Apache httpd
和 Nginx
,我这里使用的是 Nginx,由于是ECC证书,需要额外的 --ecc
参数
acme.sh --install-cert -d domain.com --ecc \
--key-file /etc/nginx/ssl/domain.com/domain.com.key \
--fullchain-file /etc/nginx/ssl/domain.com/fullchain.cer \
--reloadcmd "service nginx force-reload"
目前证书在 60 天以后会自动更新,你无需任何操作。今后有可能会缩短这个时间,不过都是自动的,你不用关心。
当然,你也可以手动更新ECC证书
acme.sh --renew -d domain.com --force --ecc
如果不是ECC证书的话,不需要--ecc
参数
acme.sh --renew -d domain.com --force
这些配置完后,就不用再管了,可以忘掉这些事了。
提示:acme.sh 官方对申请证书的频率有限制,子域名好像每周最多4次。所以不要频繁乱申请!
如果运气不好,证书文件泄露了。你需要吊销当前的ECC证书,对应命令为
acme.sh --revoke -d domain.com --ecc
不是ECC证书则不需要 --ecc
参数
acme.sh --revoke -d domain.com