Certbot申请和续签Let's Encrypt证书一键脚本

申请Let’s Encrypt证书一般采用 DNS 认证的方式,通常命令如下:

1
certbot certonly -d metazion.com -d *.metazion.com -m applicant.gmail.com --manual --preferred-challenges dns

这样交互的方式,过程中需要去域名解析服务商(如 DNSPOD)处添加 TXT 记录以供验证。每三个月需要续签一次证书,每次都要手动添加,还是很繁琐的。

各大域名解析服务商都有提供 OpenAPI,可以通过API来自动化完成上述操作。网上已经有一些相关代码,但本着自己定制的需求,实现了一份。

目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.
├── certbot_apply.sh
├── certbot_renew.sh
├── configure.sh
├── hall.py
├── hook_deploy.sh
├── hook_dns.sh
├── provider
│   ├── __init__.py
│   ├── txy.py
│   └── util.py
└── test
└── test_txy.py

  • configure.sh

    配置脚本。用户运行这个脚本,根据提示输入申请域名等信息,会生成 申请脚本 certbot_apply.sh 和 续签脚本 certbot_renew.sh,顾名思义,分别用来申请和续签证书。

  • hook_dns.sh

    DNS操作回调脚本。申请或续签时,通过回调该脚本实现添加或删除DNS验证记录。用户一般无需修改该脚本。

  • hook_deploy.sh

    证书部署回调脚本。续签证书成功后,可以通过该脚本部署新的证书,并重启Web服务器等。需要用户自行在该脚本实现相关功能。

  • hall.py

    DNS功能实现脚本。hook_dns.sh 实际调用该脚本,该脚本根据用户输入调用 provider 下的实际域名解析服务商的驱动程序完成相关功能。

  • provider

    域名解析服务商驱动程序目录。默认包含腾讯云(DNSPOD)的驱动程序 txy.py。用户如需自定义使用其他服务商,只需要提供与 configure.sh 时输入的域名解析服务商同名的 Python 驱动程序脚本,放在该目录下即可,驱动程序必要接口可以参考 txy.py

  • test

    测试脚本目录。简单测试驱动程序功能。

下面展示下实际使用的输入输出:

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
[root@gemini certbot]# ./configure.sh
Let's Encrypt证书申请和续签一键脚本
请输入申请证书的主域名(如 metazion.com)
metazion.com
请输入申请证书的完整域名,多个用空格分隔(如 metazion.com, *.metazion.com)
metazion.com *.metazion.com
请输入接收通知的电子邮箱(如 foo.gmail.com)
kaleofeng@gmail.com
请选择域名解析服务商
1: 腾讯云(DNSPod)
2: 自定义
1
请输入域名解析服务商提供的API Secret ID
AKI******************************YbN
请输入域名解析服务商提供的API Secret Key
Zrt**************************oGU
主域名:metazion.com
完整域名列表:metazion.com *.metazion.com
域名服务商:txy
Secret ID:AKI******************************YbN
Secret Key:Zrt**************************oGU
已生成申请脚本(certbot_apply.sh)。
已生成续签脚本(certbot_renew.sh)。
如需续签证书后,部署证书并重启Web服务器等,请在 /root/script/misc/certbot/hook_deploy.sh 提供相关功能。
[root@gemini certbot]#

可以调用 certbot_apply.sh 申请证书。

可以调用 certbot_renew.sh.sh 续签证书。

配合 crontab 计划任务可以实现定期续签,这样就完全自动化无人操作了。

代码在Github