申请Let's Encrypt证书一般采用 DNS 认证的方式,通常命令如下:
certbot certonly -d metazion.com -d *.metazion.com -m applicant.gmail.com --manual --preferred-challenges dns
这样交互的方式,过程中需要去域名解析服务商(如 DNSPOD)处添加 TXT 记录以供验证。每三个月需要续签一次证书,每次都要手动添加,还是很繁琐的。
各大域名解析服务商都有提供 OpenAPI,可以通过API来自动化完成上述操作。网上已经有一些相关代码,但本着自己定制的需求,实现了一份。
目录结构如下:
.
├── 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
测试脚本目录。简单测试驱动程序功能。
下面展示下实际使用的输入输出:
[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。