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

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

Posted by BlueFat on Sunday, December 27, 2020

网站一直以来都是使用的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

https://github.com/acmesh-official/acme.sh

先安装好 curl,然后:

#curl https://get.acme.sh | sh -s email=my@example.com
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 域名,则要手动更改安装脚本内容:

# 下载并保存脚本  
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

**acme.sh 默认CA为 Let’s Encrypt, 这里切换为ZeroSSL **

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

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

设置默认CA Server为ZeroSSL

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

注册ZeroSSL

acme.sh --register-account -m admin@sundayhk.com --server zerossl

签发证书

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

这里以 DNSPod 为例,首先在 DNSPod 官网申请 API ID 和 Key:

export DP_Id="<id>"
export DP_Key="<key>"

domain="sundayhk.com"
acme.sh --issue --dns dns_dp -d $domain -d *.$domain --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-384 和 ec-521

安装证书

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

domain="sundayhk.com"
acme.sh --install-cert -d $domain --ecc \
	--key-file "/data/ssl/acme/$domain.key" \
	--fullchain-file "/data/ssl/acme/$domain.pem" \
	--reloadcmd "systemctl reload nginx"
  • --ecc 表示安装 ECC 证书
  • --key-file 和 -fullchain-file 后接想要安装到的目录及证书名
  • --reloadcmd 后接服务的重启命令,程序自动续期证书后会运行该命令使其生效

更多信息可参考如下: