ACME协议是利用DNS验证域名所有权的一种方式,其中需要在DNS服务器上添加一个名为“acme-challenge”的TXT记录。但是,如果在该域名上已经有了同名的TXT记录,就会导致冲突。解决该问题的方法是可以在添加“acme-challenge”记录时先删除同名的TXT记录。
示例代码如下:
import os
import dns.resolver
from certbot import main as certbot_main
# 检查是否有同名的TXT记录
def check_txt_record(domain):
challenge_domain = '_acme-challenge.' + domain
answers = dns.resolver.query(challenge_domain, 'TXT')
if answers:
for rdata in answers:
txt_record = str(rdata).strip('"')
if txt_record:
return True
return False
# 添加ACME验证记录
def add_challenge_record(domain, token):
command = f"certbot certonly --manual --preferred-challenges=dns --manual-public-ip-logging-ok -d {domain} --manual-auth-hook '/usr/bin/env python add_dns_record.py {domain} {token}'"
os.system(command)
# 删除同名的TXT记录
def delete_txt_record(domain):
challenge_domain = '_acme-challenge.' + domain
txt_records = dns.resolver.query(challenge_domain, 'TXT')
if txt_records:
for rdata in txt_records:
txt_record = str(rdata).strip('"')
delete_dns_record(challenge_domain, 'TXT', txt_record)
# 删除DNS记录
def delete_dns_record(domain, record_type, value):
cmd = f"sh /usr/local/bin/dns.sh delete {domain} {record_type} '{value}'"
os.system(cmd)
# 添加DNS记录
def add_dns_record(domain, record_type, value):
cmd = f"sh /usr/local/bin/dns.sh add {domain} {record_type} '{value}'"
os.system(cmd)
# 获取ACME验证token
def get_acme_token(domain):
token = ''
cmd = f"echo $TOKEN_{domain}"
output = os.popen(cmd).read()
if output:
token = output.strip()
return token
# 添加ACME验证记录并删除同名的TXT记录
def add_challenge_and_delete_txt_record(domain):
token = get_acme_token(domain)
if not check_txt_record(domain):
add_challenge_record(domain, token)
delete_txt_record(domain)
# 主函数
if __name__ == '__main__':
domain = 'example.com'
add_challenge_and_delete_txt_record(domain)
运行该代码时,会先检查是否有同名的TXT记录,如果有则删除该记录,然后再添加ACME验证记录。这样就能避免“acme-challenge”和TXT记录冲突的问题。
上一篇:acm编程大赛训练网站