使用 acme.sh 自动签发 ZeroSSL 的 ECC 证书

Posted by Sunday on 2020-12-27

网站一直以来都是使用的Let’s Encrypt SSL证书,主要是因为Let’s Encrypt浏览器兼容性较好,支持ACME自动化部署,支持泛域名证书等,但是今天起网站开始放弃Let’s Encrypt证书,全站更换ZeroSSL提供的SSL证书。

为什么放弃Let’s Encrypt证书?

由于Let’s Encrypt证书的OCSP验证域名由于未知原因无法访问,不过网站前一阵子给服务器开启了OCSP装订,变相解决了部分浏览器访问缓慢的问题;
但是经过测试,发现有些浏览器,比如IOS端 Chromium 系的浏览器:Chrome、新版Egde等,就算服务器开启了OCSP装订,还是会去强制访问OCSP验证证书有效性,虽然超时时间只有3s,但是问题没有得到解决就很不爽; 不高兴.png
不过也没有更好的解决办法了。

并且Let’s Encrypt的X3根证书也将到期,之后会使用自己签发的根证书,虽然根证书更换后OCSP无法访问的问题会得到解决,但是新的根证书时间太短导致安卓7以下以及16年以前的一些设备没办法信任这个证书导致老设备的兼容性问题;

看来只能更换SSL证书来彻底解决该问题了。

为什么选择ZeroSSL?

经过大佬Luminous推荐,ZeroSSL家的SSL证书可支持ACME自动化部署,并且支持申请泛域名证书,所以准备考虑切换到这家CA的证书;
ZeroSSL的证书之前也听说过,没有考虑的原因是之前我点开价格后发现免费用户只能签3个单域名证书,其他的类型证书都是收费的(贫穷限制了我的想象力);

不过也怪我研究不够深入,在ACME文档的介绍中发现,通过ACME自动部署的方式,可以进行无限制的签发普通域名、多域名证书、甚至通配证书等,并且可以acme.sh脚本官方也支持直接将CA切换到ZeroSSL,直接一键就可以完成证书的切换

安装 acme.sh

先安装好 curl,然后:

1
curl https://get.acme.sh | sh

该安装脚本做了几件事:

  1. 把 acme.sh 安装到了 home 目录下:~/.acme.sh/
  2. 创建了一个 bash 的 alias, 方便使用: alias acme.sh=~/.acme.sh/acme.sh
  3. 创建了 cronjob,每天 0:00 点自动检测所有的证书,如果快过期了,则会自动更新证书。

如果因为网络问题,无法连接到 https://raw.githubusercontent.com 域名,则要手动更改安装脚本内容:

1
2
3
4
5
6
7
# 下载并保存脚本
curl https://get.acme.sh -o acme_install.sh
# 更改脚本内域名,使用代理加速
sed -i 's/raw/ghproxy.com\/https:\/\/raw/g' acme_install.sh
# 安装
chmod +x acme_install.sh
./acme_install.sh

注册 ZeroSSL 账号

acme.sh 默认使用 Let’s Encrypt 进行证书注册,本本章使用 ZeroSSL 进行注册,所以需要进行相关配置

官网注册:https://zerossl.com/

注册完成之后进入 Dashboard,选择右侧的 Developer 标签,生成 EAB Credentials 并记录下来。

img

将 acme.sh 的注册服务器改为 ZeroSSL

文档:https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA

运行,替换 eab-kideab-hmac-key 为上一步中生成的:

1
2
3
acme.sh --register-account --server zerossl \
--eab-kid xxxxxxxxxxxx \
--eab-hmac-key xxxxxxxxx

将其设置为默认 Server

1
acme.sh --set-default-ca --server zerossl

签发证书

本文章使用 DNS 验证的方法来验证域名,acme.sh 可以通过 DNS 提供商的 API 自动设置验证记录,具体用法详见文档:https://github.com/acmesh-official/acme.sh/wiki/dnsapi

1
2
3
4
acme.sh --issue \
--dns dns_dp \
-d sundayhk.com -d *.sundayhk.com \
--keylength ec-256

其中:

  • --dns 指定 DNS 服务商,dns_dp 代表 DNSPod,还有 dns_cf 代表 CloudFlare,更多的字段见 https://github.com/acmesh-official/acme.sh/tree/master/dnsapi
    如果不使用 API 自动添加验证,则不用添加后续参数,如:acme.sh --issue --dns -d sundayhk.com ....
  • -d *.sundayhk.com 表示签发泛域名证书
  • --keylength ec-256 表示签发 ECC 证书,不添加则签发 RSA 证书,可选参数还有 ec-384ec-521

安装证书

使用 --install-cert 命令安装证书到指定目录,切记不要手动去复制签发的证书文件,会影响后续使用

1
2
3
4
acme.sh --install-cert -d sundayhk.com --ecc \
--key-file "/data/ssl/acme/sundayhk.com.key" \
--fullchain-file "/data/ssl/acme/sundayhk.com.pem" \
--reloadcmd "/etc/init.d/nginx reload"

其中:

  • --ecc 表示安装 ECC 证书
  • --key-file-fullchain-file 后接想要安装到的目录及证书名
  • --reloadcmd 后接服务的重启命令,程序自动续期证书后会运行该命令使其生效

大功告成!

更多信息可参考如下:

转载自:https://morooi.cn/2021/acme-sh/