Letsencrypt续签泛域名证书
之前用letsencrypt为这个网站生成的证书快到期了,我是给泛域名生成的证书,所以在续签证书的时候需要DNS验证,但是续签是个自动的过程,你不知道需要把TXT记录改成什么。所以自动续签命令一直失败。看了一些教程,需要在续签的时候用有一个脚本来修改DNS记录,所以需要调用域名注册商的一些API。正好godaddy有API,下面分享一下步骤。
先决条件
- 一个在Godaddy注册的域名
- 证书是letsencrypt生成的
具体操作
- 进入这个页面,为自己的Godaddy账号生成一对API Key,生成production的就可以。这个key是不会过期的,但只会出现一次,所以一定要保存好。
- 由于我之前已经生成了证书,所以我的域名记录里有一个TXT记录,这是当时为了生成证书添加的,所以现在更新证书只需要修改对应的值就可以了。我选择使用这个API。
API recordReplaceTypeName:https://api.godaddy.com/v1/domains/mmlnp.com/records/TXT/_acme-challenge
这个API的作用就是替换某个域名的某个已存在的记录的值。控制台上如下图这样填就可以
其中data就是替换后的值,ttl最短是600,port最小是1.这三个是必填的,默认控制台会有一些别的参数,那些默认就好。写完了可以点击Execute测试一下,但这个控制台是会用OTE
API进行测试,可能会失败,我得到的错误是404,显示该域名没有被注册,但我用production的Key在代码中测试是没问题的。所以控制台上只要没有其他的错误就不需要担心。
点击Execute之后会生成一个curl命令,完全可以复制出来到linux机器上执行,只要把url和key换成相应的就可以。
- 下一步就可以测试代码调用这个PUT API了,这个各有各的方法,我就不赘述了。
- 最后一步是整合所有功能,这个可能大家用的东西都不一样,我的方式仅供参考。
我先创建一个bash脚本:
#!/usr/bin/bash
#要配置的域名
DOMAIN="mmlnp.com"
# 脚本路径
PATH="/home/mml"
#要为那个 DNS RR 添加 TXT 记录
CREATE_DOMAIN="_acme-challenge"
# $CERTBOT_VALIDATION 是 Certbot 的内置变量,代表需要为 DNS TXT 记录设置的值
# 调用脚本,自动设置 DNS TXT 记录。
/usr/bin/python $PATH"/renewcert.py" $DOMAIN $CREATE_DOMAIN $CERTBOT_VALIDATION >/var/log/certdebug.log
# DNS TXT 记录刷新时间
/usr/bin/sleep 30
renewcert.py是我使用python调用Godaddy的API。
import urllib2
import json
import sys
value = sys.argv[3]
api_url = 'https://api.godaddy.com/v1/domains/mmlnp.com/records/TXT/_acme-challenge';
head = {}
head['Accept'] = 'application/json'
head['Content-Type'] = 'application/json'
head['Authorization'] = 'sso-key Key:Secret'
records_a = {
"data" : value,
"ttl" : 600,
"port" : 1
}
put_data = [records_a]
req = urllib2.Request(api_url,headers = head,data = json.dumps(put_data))
req.get_method = lambda: 'PUT'
rsp = urllib2.urlopen(req)
code = rsp.getcode()
if code == 200:
print('succeed!')
else:
print(code)
这两个文件准备好之后,在letsencrypt目录下执行这个命令可以测试续签泛域名证书。没有报错说明配置没有问题。
./certbot-auto renew --cert-name mmlnp.com --manual-auth-hook /home/mml/au.sh --dry-run
--manual-auth-hook是执行验证脚本,验证TXT记录。
--dry-run 是演习一次,不会保存生成的证书,去掉这个参数就真的会续签证书了。
因为证书有效期是三个月,所以我写了一个crontab,自动续签。命令部分如下:
/home/mml/letsencrypt/certbot-auto renew --cert-name mmlnp.com --manual-auth-hook /home/mml/au.sh --renew-hook "service nginx reload"
--renew-hook 是在成功续签证书之后执行一个命令,可以用来让nginx重新加载证书。
参考连接:
https://www.4spaces.org/certbot-command-line-tool-usage-document/
https://blog.csdn.net/lihao19910921/article/details/81534188
https://www.xiaoweigod.com/network/1633.html