如何自动化更新SSL证书

橘子 发布于 23 天前 83 次阅读


WHY

可恶啊!("▔□▔)/ 为了 能让更多用户买付费证书 进一步提高证书安全性,由google提议将免费SSL证书的有效期从一年进一步下调到90天!!!

消息来源以及参考文章:

然而橘子的证书马上就要到期了Σ( ̄□ ̄||)急需更新。真的是被时代洪流裹挟不得不学新知识~之前那篇老文章的SSL证书申请方法虽然是没失效吧,但是每次都手动申请有效期只有90天的证书也太累了。所以,急需一种自动化更新SSL证书的手段!

使用现成自动化工具

总的来说,使用的是这个自动化工具,acme.sh

Github-Card

这个自动化工具有中文的教程!戳这里:acme.sh中文教程

( ̄3 ̄)好啦,可以偷懒不继续写啦

("▔□▔)/你倒是介绍一下踩坑注意事项啊

(`・ω・´)好嘛

注意事项

所以接下来是踩坑的地方以及注意事项~

安装命令干了什么事?

首先使用下面这个命令安装的时候,实际上是把get.acme.sh网址上下载的内容直接作为输入交给了shell,因此这个命令实际上不会在执行目录下载什么文件,而是直接把文件安装到了~/.acme.sh/

#!/usr/bin/bash
curl https://get.acme.sh | sh -s email=my@example.com

此外,这里的邮箱应该填写自己的邮箱。这里有一个小知识点,就是免费签发证书的机构是不需要自己手动注册的,只要你通过 acme.sh 申请证书,它会自动为你注册一个证书签发机构的账户(例如Let's Encrypt),并将它与你提供的邮箱关联。这个注册过程实际上是没有认证的

(小声)但也不需要认证不是吗,毕竟只有实际网站拥有者持有的秘钥才是有效的,其他人冒用该网站申请的证书也是无用的——除非网站后台被攻破了!那这……

用DNS进行验证

然后,我这里是没有按照教程修改默认CA的,直接使用的ZeroSSL,而不是教程推荐的Let's Encrypt,问题不大。

我是使用的DNSPod,因此该教程正好完美符合我的情况。这里有一个坑,很蠢的坑,就是教程中提示,拿到的id需要这样设置。首先export这个命令是在shell环境中使用的,所以这个配置不用存入某个文件而是直接在终端中输入,并且后续acme.sh会自己把它记住。

#!/usr/bin/bash
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"

其次,教程给的DNSPod的链接是这个,这实际上是DNSPod的官网,而由于它和腾讯云的奇怪结合,导致经常点某个按钮就跳转到腾讯云了非常麻烦,所以这里给出明确指路~

  • 首先点击右上角头像,选择“API秘钥”
  • 然后在界面上有两个选项卡,一个是“腾讯云API秘钥”(默认选项卡),一个是“DNSPod Token”
  • 这里要选后一个,“DNSPod Token”。("▔□▔)/一定要选对!

必须使用“DNSPod Token”这个生成的才能使用,“腾讯云API秘钥”是用不了的!!

必须使用“DNSPod Token”这个生成的才能使用,“腾讯云API秘钥”是用不了的!!

必须使用“DNSPod Token”这个生成的才能使用,“腾讯云API秘钥”是用不了的!!

(重要的事情说三遍)

那怎么自动化呢

( ̄3 ̄)这下好了吧

("▔□▔)/等等,你没说怎么自动更新啊

(`・ω・´)嘿嘿,其实acme已经帮你做了~

既然问到了自动更新,那就不妨试试这行代码吧:

#!/usr/bin/bash
crontab -l

他能列出所有当前用户的定时任务~(之前的文章介绍过,这篇: 使用crontab设置服务器定时任务)然后你就会发现已经有一条acme的自动任务了,在每天自动检查证书情况。

常用代码

其他事项教程都已经给出来了,这里就不一一列举了。最后贴上常用代码:

#!/usr/bin/bash
# 更新命令,如果没有到更新时间则会不更新
acme.sh --renew -d example.com

# 强制更新命令
acme.sh --renew -d example.com --force

# 查看已经安装的证书信息
acme.sh --info -d example.com

# 将已安装的证书安装(复制)到指定路径,同时重启nginx
acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     "service nginx reload"

# 更新acme.sh
acme.sh --upgradee
# 启动acme.sh的自动更新
acme.sh --upgrade --auto-upgrade
# 关闭acme.sh的自动更新
acme.sh --upgrade --auto-upgrade  0