背景
域名托管在华为云。因为是个人站点,为了降低成本,使用的3个月的免费https的证书。之前因为换证书频率不高,3个月换一次,个人没觉得多大的问题,也就几分钟的事情。最近闲来无事,研究下证书自动续签、部署的事。我使用的免费证书在freessl.cn申请的(非广告),里面有个证书自动化的功能
解决方案
查看界面的指引文档,也是基于acme.sh
具体流程
服务器安装acme
在线安装
curl https://get.acme.sh | sh -s email=my@example.com
或者wget
wget -O - https://get.acme.sh | sh -s email=my@example.com
或者git(我服务器刚好装了git,就用了这种方法)
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install -m my@example.com
安装完成后重启终端生效,使用acme.sh -v获取到版本信息即安装成功
acme.sh -v
https://github.com/acmesh-official/acme.sh
v3.0.7
注册ACME客户端
因为我是在freessl处理的,注册客户端用的它提供的服务器地址及对应的EAB 凭证
--server https://acme.certcloud.cn/acme/directory
--eab-kid J9Lf******
--eab-hmac-key MD8C******
acme.sh --register-account --server https://acme.certcloud.cn/acme/directory --eab-kid J9Lf****** --eab-hmac-key MD8C******
执行后服务器终端提示成功,在fressssl界面也有提示
申请证书
按照流程申请证书
设置华为云账号信息
域名在华为,需要设置华为云账号的环境变量信息
export HUAWEICLOUD_Username="<Your IAM Username>"
export HUAWEICLOUD_Password="<Your Password>"
export HUAWEICLOUD_DomainName="<Your DomainName>"
这个环境变量信息,按照下列操作步骤可以获得。
先在华为云创建子账号
登录保护需要关闭
创建完成后登录子账号,需要重置密码,查看我的凭证
对应信息如下:
HUAWEICLOUD_Username = IAM用户名
HUAWEICLOUD_Password = IAM创建时填的密码
HUAWEICLOUD_DomainName = 账号名
自动dns验证
-d 参数为前面申请的证书的域名
./acme.sh --issue --dns dns_huaweicloud -d example.com
如果报错 dns_api(dns_huaweicloud): Error getting token. 这个是华为账号登录出错了,可以再核对下账号信息。
也可以尝试修改acme安装目录下,华为dns的代码,我的在这个目录/root/.acme.sh/dnsapi/dns_huaweicloud.sh
dns_api="https://dns.cn-north-4.myhuaweicloud.com" # Should work
....
\"project\": {
\"name\": \"cn-north-4\"
}
....
都换成国内的地址
如果执行没有错误会获得证书
[Sun 10 Oct 2021 09:57:53 PM HKT] Your cert is in: /root/.acme.sh/im.ci/im.ci.cer
[Sun 10 Oct 2021 09:57:53 PM HKT] Your cert key is in: /root/.acme.sh/im.ci/im.ci.key
[Sun 10 Oct 2021 09:57:53 PM HKT] The intermediate CA cert is in: /root/.acme.sh/im.ci/ca.cer
[Sun 10 Oct 2021 09:57:53 PM HKT] And the full chain certs is there: /root/.acme.sh/im.ci/fullchain.cer
安装证书
-d 证书的域名
--key-file 证书key安装的地址
--fullchain-file 证书cer安装的地址
--reloadcmd "nginx -s reload" 重载ngxin配置
acme.sh --installcert -d example.com --key-file /mycertify/ssl/msh.com.key --fullchain-file /mycertify/ssl/msh.com.cer --reloadcmd "nginx -s reload"
如果是apache
acme.sh --installcert -d example.com --key-file /mycertify/ssl/example.com.key --fullchain-file /mycertify/ssl/example.com.cer --cert-file /mycertify/ssl/cert.cer --reloadcmd "httpd -k graceful"
注意:测试过程使用–reloadcmd “echo Hello World”,实际上可能执行nginx -s reload或docker restart或kubectl rollout restart等,你需要考虑定时任务触发执行该命令对业务的影响。
自动续期和部署
当我们成功执行了acme.sh --issue和acme.sh --install-cert命令后,证书已经成功部署,后续acme.sh会帮助我们完成自动化,原因是当我们安装acme.sh时同时创建了 一个crontab定时任务
[root@master0 ~]# crontab -l
47 17 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
47 17 * * *是一个cron表达式,表示每天17点47分会执行一次,执行的命令为"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null, 该命令会检测是否有需要续期的证书,若有则根据我们第一次手动执行的逻辑重新签发一张证书(acme.sh --issue)并进行证书安装(acme.sh --install-cert)。
你可以通过crontab -e命令修改执行的时间
参考资料
blog.freessl.cn/how-to-use-… docs.certcloud.cn/docs/instal… github.com/acmesh-offi…