使用 acme.sh 调用 Godaddy API 的方式签发证书以及签发通配符证书

本篇将介绍如何通过命令行的方式通过 acme.sh 调用 Godaddy API 接口申请证书。

安装 acme.sh

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

申请 Googaddy AK 和 SK

通过 API 的方式可以省去了登录域名解析商后台设置解析的步骤,节省时间,加快申请速度。

登录 https://developer.godaddy.com/keys/ 申请生产(Production)模式下的 AK 和 SK。

其他域名解析商的 API 可以参考这里

设置环境变量

export GD_Key=""
export GD_Secret=""

申请证书

1.比如我希望申请 awen.me、www.awen.me、file.awne.me 这三个证书,则执行:

/root/.acme.sh/acme.sh --issue --dns dns_gd -d awen.me -d www.awen.me -d file.awen.me

脚本就会自动添加解析并等待解析生效,由于解析生效需要些时间,因此,这里的等待时间会有120秒左右。

当提示如下信息时,则表示证书申请完成

证书放在当前用户的根目录下的 .acme.sh/ 下:

[Wed Mar  7 13:50:50 CST 2018] Your cert is in  /root/.acme.sh/awen.me/awen.me.cer
[Wed Mar  7 13:50:50 CST 2018] Your cert key is in  /root/.acme.sh/awen.me/awen.me.key
[Wed Mar  7 13:50:53 CST 2018] The intermediate CA cert is in  /root/.acme.sh/awen.me/ca.cer
[Wed Mar  7 13:50:53 CST 2018] And the full chain certs is there:  /root/.acme.sh/awen.me/fullchain.cer

说明:

名称 说明
awen.me.cer 表示是该域名的服务端证书公钥内容
awen.me.key 表示的是该域名的私钥
ca.cer 表示的是根证书或中间证书公钥内容
fullchain.cer 包含了服务端证书和根证书以及中间证书的完整公钥内容

通常建议加载证书选择公钥文件为fullchain.cer 的公钥文件,这样避免一些浏览器无法识别根证书或中间证书从而导致浏览器报错,例如提示证书不受信任。

申请 ECC 通配符证书

什么是 ECC 证书

我们常见的 AES-GCM、ChaCha20-Poly1305,都是对称加密算法。对称内容加密强度非常高,加解密速度也很快,只是无法安全地生成和保管密钥。在 TLS 协议中,应用数据都是经过对称加密后传输的,传输中所使用的对称密钥,则是在握手阶段通过非对称密钥交换而来。

而非对称密钥交换能在不安全的数据通道中,产生只有通信双方才知道的对称加密密钥。目前最常用的密钥交换算法有 RSA 和 ECDHE:RSA 历史悠久,支持度好,但不支持 PFS(Perfect Forward Secrecy);而 ECDHE 是使用了 ECC(椭圆曲线)的 DH(Diffie-Hellman)算法,计算速度快,支持 PFS。要了解更多 RSA 和 ECDHE 密钥交换的细节,可以阅读 Cloudflare 的这篇文章

如何申请

目前 acme.sh 已经全面支持 ACME v2,可以直接使用如下方式申请带通配符的证书,如果指定 –keylength 跟上相应的参数还可以申请 ECC 证书

acme.sh --issue -d awen.me -d *.awen.me --dns dns_gd --keylength ec-256

–keylength 指定ECC证书的类型

有效值是:

ec-256(prime256v1,“ECDSA P-256”)
ec-384(secp384r1,“ECDSA P-384”)
ec-521(secp521r1,“ECDSA P-521”,目前尚未得到Let’s Encrypt的支持。)

生成之后其目录在~/.acme.sh/domain_ecc 下,其中 domain 是你申请的域名,如图所示

然后将该证书加载到 web 服务器配置文件中即可。

通过浏览器查看,可以看到已经显示了 *.awen.me 了。

证书默认是 60天自动更新的,而安装证书,我是使用脚本自动更新后安装证书

我的做法是在/usr/local/bin 下加入一个 updatessl 的脚本,内容如下

#!/bin/bash
/root/.acme.sh/acme.sh  --installcert  -d  awen.me --ecc --keypath   /usr/local/nginx/ssl/awen.me.key --fullchainpath /usr/local/nginx/ssl/awen.me.cer --reloadcmd  "/etc/init.d/nginx restart"

然后加入计划任务

# crontab -l
27 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
0 3 * * * root "/usr/local/bin/updatessl" > /dev/null

第一条是 acme.sh 自动加的计划任务,表示每天凌晨27分进行检查
第二条是自定义的,表示每天的凌晨3点执行安装,保持证书是最新的。

本文参考:
1.https://imququ.com/post/ecc-certificate.html
2.https://github.com/Neilpang/acme.sh