使用crontab 和 Certbot 对免费的 Let’s Encrypt 证书自动续期

Let’s Encrypt 颁发的证书的有效期只有90天,每次快过期的时候就需要手动更新 SSL 证书。
如果项目只有你一个人维护,刚好你休假了,休假前你也忘记手动更新证书了,那么就没法了,想想在外面玩,遇到这事还得找个网吧紧急处理的心情。😞😞😞

如果你有看过我写的 Linux定时任务crontab,我相信你已经想到了使用crontab来创建一个任务定时自动更新证书。
没错,这篇文章就是要讲这个。

什么是 Let’s Encrypt ?

SSL 证书一般均需要付费且价格不算便宜(一般最便宜的一档 SSL 一年的费用为 500 元左右),免费的证书较少且申请也较为麻烦。 Let’s Encrypt 是由 Mozilla 联盟思科推出的开源免费证书,旨在帮助全球网站取得 HTTPS 证书进而加密用户与网站之间的流量传输,目前已经得到了所有主流浏览器的支持。这套证书的安装也非常简单。

Let’s Encrypt 是 一个叫 ISRG ( Internet Security Research Group ,互联网安全研究小组)的组织推出的免费安全证书计划。参与这个计划的组织和公司可以说是互联网顶顶重要的先驱,除了前文提到的三个牛气哄哄的发起单位外,后来又有思科(全球网络设备制造商执牛耳者)、 Akamai 加入,甚至连 Linux 基金会也加入了合作,这些大牌组织的加入保证了这个项目的可信度和可持续性。

什么是 Certbot ?

尽管项目本身以及有该项目签发的证书很可信,但一开始 Let’s Encrypt 的安全证书配置起来比较麻烦,需要手动获取及部署。存在一定的门槛,没有一些技术底子可能比较难搞定。然后有一些网友就自己做了一些脚本来优化和简化部署过程。其中有一个网友 xdtianyu 做了一个可以快速获取及更新证书的 letsencrypt.sh 脚本被广泛使用。

首先要感谢 xdtianyu 同学的努力付出。我之前用的也是这个脚本,不知道是不是姿势不对,虽然顺利地按照流程装上了,但用 SSLlabs 检测我配的网站还是不太安全,在很多浏览器上都被标注为“不安全”。当时因为忙也没有太多时间折腾和细究。

后来看到 ISRG 的发起者 EFF (电子前哨基金会)为 Let’s Encrypt 项目发布了一个官方的客户端 Certbot ,利用它可以完全自动化的获取、部署和更新安全证书。这真是非常容易、方便呀,所以我们就可以直接使用官方客户端,不需要再使用第三方的工具了。虽然第三方工具也可以使用,但是官方工具更权威,风险也更小,而且遇到问题也更容易解决,毕竟有官方的支持。何况 Certbot 确实非常方便,也比所有的第三方工具都更方便,何乐而不用呢?

Certbot 如何安装及安装后如何获取 HTTPS 证书

还是那句话,直接看官方文档,网上很多第三方的文章其实都是炒来炒去,可能不对或已过时。
因此我不会在我的博客里面重复写这些。

官方文档 真的写的很详细了,选择你的使用的 web server 和操作系统就看打开对应的安装使用说明文档。

HTTPS证书自动续期步骤

1. 查看证书信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ sudo certbot certificates
[sudo] password for admin:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: api.xxx.com
Serial Number: 347c6f791cc3703d6dd475aedd6201253b8
Key Type: RSA
Domains: api.xxx.com
Expiry Date: 2021-08-03 01:22:38+00:00 (VALID: 82 days)
Certificate Path: /etc/letsencrypt/live/api.xxx.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/api.xxx.com/privkey.pem
Certificate Name: cnapi.xxx.com
Serial Number: 39628b88c7639e157e0d4c266bad5ec9457
Key Type: RSA
Domains: cnapi.xxx.com
Expiry Date: 2019-05-02 11:46:07+00:00 (INVALID: EXPIRED)
Certificate Path: /etc/letsencrypt/live/cnapi.xxx.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/cnapi.xxx.com/privkey.pem
Certificate Name: repo.xxx.com
Serial Number: 3c0afafad7e521dcaaf89c3aa9f51b61724
Key Type: RSA
Domains: repo.xxx.com
Expiry Date: 2017-12-19 06:59:00+00:00 (INVALID: EXPIRED)
Certificate Path: /etc/letsencrypt/live/repo.xxx.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/repo.xxx.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

通过证书信息,我们知道证书过期时间为2021-08-03 01:22:38

2. 使用强制更新证书命令

为什么要强制更新呢?

  • 因为 crontab 是不能直接按天数定时执行任务的。
  • 而且当证书还有效时,并不会更新证书。当证书离过期时间很接近时,执行更新才会真正更新SSL证书。

所以为了确保证书能真正被更新,故采用强制更证书的方式更为妥当。

当然如果你要想按天数定时执行,也是可以间接实现的。当然这不是本文的重点,感兴趣的话请参考 crontab中如何实现每隔多少天执行一次脚本

certbot 强制更新证书只用加上 --force-renewal 参数, 执行命令 certbot renew --force-renewal即可。如果是想更新指定的证书使用参数--cert-name 。如:

1
sudo certbot renew --cert-name api.xxx.com --force-renewal

3. 编写更新证书脚本

对于要执行的命令比较长时,写成脚本更加方便。

1
sudo vim certbot-renew.sh

脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# author gan
#service tomcat restart
echo "==================Certbot Renew====================="
echo "==================`date`============================"

# 更新TLS证书
/usr/bin/certbot renew --cert-name api.kingtingtech.com --force-renewal
# 重启Web服务器
systemctl restart httpd

echo "==================End==============================="

4. 创建crontab任务

  1. 进入编辑crontab任务列表
    1
    sudo crontab -e
  2. 添加定时执行更新证书脚本的任务
1
0 3 1 * * /ktt/crons/certbot-renew.sh &>> /ktt/crons/certbot-renew.log
  • 0 3 1 * * 指每个月1号3点0分执行任务
  • &>>
    & 指将标准输出标准错误输出都重定向到certbot-renew.log文件;
    >覆盖写入到文件;
    >>追加写入到文件。

bash手册:

1
2
3
4
5
6
7
8
9
standard error:

&>word and
>&word

Of the two forms, the first is preferred. This is semantically
equiva- lent to

>word 2>&1
  1. 保存。

使用crontab 和 Certbot 对免费的 Let’s Encrypt 证书自动续期

https://ganzhixiong.com/p/95b00866/

Author

干志雄

Posted on

2021-08-17

Updated on

2021-08-17

Licensed under

Comments