DNS手动模式进阶:acme.sh实现非交互式TXT记录验证
【免费下载链接】acme.sh 项目地址: https://gitcode.com/gh_mirrors/acm/acme.sh
你是否曾因DNS验证流程繁琐而放弃部署HTTPS证书?是否在自动化脚本中被手动添加TXT记录打断流程?本文将详细介绍如何使用acme.sh的DNS手动模式,通过非交互式方式完成域名验证,解决证书申请过程中的痛点。读完本文,你将掌握:
- DNS手动模式的工作原理与适用场景
- 非交互式TXT记录验证的完整实现步骤
- 自动化脚本集成与错误处理技巧
- 多域名批量验证的高效方法
为什么需要DNS手动模式?
当你的域名托管商不提供API接口,或处于安全限制无法开放API权限时,DNS自动验证方案将无法使用。此时acme.sh的DNS手动模式成为理想选择。相比传统的文件验证(Webroot模式),DNS验证具有以下优势:
| 验证方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| DNS手动模式 | 无需开放80/443端口、支持泛域名证书 | 需手动添加TXT记录、验证延迟 | 无API支持的域名、内网服务器 |
| Webroot模式 | 验证速度快、配置简单 | 需开放Web服务、不支持泛域名 | 已有Web服务器的场景 |
| Standalone模式 | 无需现有Web服务 | 需占用80/443端口、需root权限 | 临时服务器、新环境部署 |
官方文档详细说明了各种验证模式的使用方法:README.md
DNS手动模式工作原理
acme.sh的DNS手动模式通过以下流程完成验证:
非交互式验证实现步骤
1. 安装acme.sh
首先确保已正确安装acme.sh。推荐使用git方式安装,便于后续升级:
git clone https://gitcode.com/gh_mirrors/acm/acme.sh.git
cd ./acme.sh
./acme.sh --install -m your@email.com
安装完成后,关闭当前终端并重新打开,使别名生效。安装程序会自动创建:
- 证书存储目录:
~/.acme.sh/ - 每日定时任务:自动检查证书更新
- 命令别名:
acme.sh=~/.acme.sh/acme.sh
2. 生成验证所需的TXT记录
执行以下命令生成域名验证所需的TXT记录:
acme.sh --issue --dns -d example.com -d "*.example.com" --output-txt dns_challenge.txt
参数说明:
--dns: 指定使用DNS验证模式-d: 指定需要验证的域名,支持多个域名和泛域名--output-txt: 将TXT记录输出到指定文件,便于后续处理
命令执行后,会在当前目录生成dns_challenge.txt文件,包含所有需要添加的TXT记录:
# dns_challenge.txt内容示例
_acme-challenge.example.com. 300 IN TXT "9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c"
_acme-challenge.www.example.com. 300 IN TXT "f7KhbvFq4929dv02j3l234nl234nlk234lk234nlk23"
3. 自动添加TXT记录到DNS服务器
虽然是"手动模式",但我们可以通过脚本实现TXT记录的自动添加。根据你的DNS提供商,选择相应的脚本工具:
- 某云用户:使用对应脚本
- 其他提供商:查看对应目录中的脚本
以下是一个通用的TXT记录添加脚本框架,你可以根据自己的DNS管理方式进行修改:
#!/bin/bash
# add_txt_records.sh
# 从dns_challenge.txt文件读取TXT记录并添加到DNS服务器
while read -r line; do
# 跳过注释和空行
if [[ $line == \#* || -z $line ]]; then
continue
fi
# 解析域名和记录值
domain=$(echo "$line" | awk '{print $1}')
ttl=$(echo "$line" | awk '{print $2}')
type=$(echo "$line" | awk '{print $3}')
value=$(echo "$line" | awk '{print $4}' | sed 's/"//g')
echo "添加TXT记录: $domain $value"
# 这里添加你的DNS记录添加命令
# 例如使用nsupdate、curl调用API等方式
# nsupdate -k /path/to/key << EOF
# server dns.example.com
# update add $domain $ttl $type $value
# send
# EOF
done < dns_challenge.txt
echo "TXT记录添加完成,请等待DNS生效(通常需要1-5分钟)"
4. 验证TXT记录生效
DNS记录添加完成后,需要验证记录是否已生效。可以使用以下命令检查:
# 检查TXT记录
nslookup -type=TXT _acme-challenge.example.com
dig +short TXT _acme-challenge.example.com
为避免DNS缓存影响,建议使用多个DNS服务器进行查询:
# 使用公共DNS服务器查询
dig @8.8.8.8 TXT _acme-challenge.example.com
dig @114.114.114.114 TXT _acme-challenge.example.com
acme.sh也提供了内置的DNS检查功能:
acme.sh --dnscheck -d example.com
5. 完成证书申请
确认TXT记录生效后,执行以下命令完成证书申请:
acme.sh --renew -d example.com -d "*.example.com"
如果一切顺利,证书将生成在~/.acme.sh/example.com/目录下。你可以使用--install-cert命令将证书安装到Web服务器:
# Nginx安装示例
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.cer \
--reloadcmd "systemctl reload nginx"
部署脚本目录中提供了多种服务器的证书安装脚本,例如对应脚本和对应脚本。
非交互式验证的高级技巧
1. 脚本集成与自动化
通过以下步骤,可以将DNS手动模式集成到自动化脚本中:
- 使用
--output-txt参数将TXT记录输出到文件 - 编写自定义DNS更新脚本处理记录添加
- 使用循环检查TXT记录是否生效
- 自动执行验证命令完成证书申请
完整的自动化脚本示例:
#!/bin/bash
# auto_ssl.sh
DOMAINS=("example.com" "*.example.com")
OUTPUT_FILE="dns_challenge.txt"
# 生成TXT记录
acme.sh --issue --dns -d "${DOMAINS[@]}" --output-txt $OUTPUT_FILE
# 添加TXT记录到DNS服务器(需根据实际情况修改)
./add_txt_records.sh $OUTPUT_FILE
# 等待DNS生效,最多等待300秒
MAX_WAIT=300
WAIT_INTERVAL=10
elapsed=0
while [ $elapsed -lt $MAX_WAIT ]; do
# 检查所有TXT记录是否生效
all_ready=true
while read -r line; do
if [[ $line == \#* || -z $line ]]; then
continue
fi
domain=$(echo "$line" | awk '{print $1}')
expected_value=$(echo "$line" | awk '{print $4}' | sed 's/"//g')
# 查询实际TXT记录
actual_value=$(dig +short TXT $domain | tr -d '"' | head -n 1)
if [ "$actual_value" != "$expected_value" ]; then
all_ready=false
echo "等待TXT记录生效: $domain"
break
fi
done < $OUTPUT_FILE
if [ "$all_ready" = true ]; then
echo "所有TXT记录已生效,开始验证..."
break
fi
sleep $WAIT_INTERVAL
elapsed=$((elapsed + WAIT_INTERVAL))
done
if [ $elapsed -ge $MAX_WAIT ]; then
echo "错误:TXT记录在$MAX_WAIT秒内未生效"
exit 1
fi
# 执行验证并安装证书
acme.sh --renew -d "${DOMAINS[@]}"
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.cer \
--reloadcmd "systemctl reload nginx"
2. 多域名批量验证
对于管理多个域名的场景,可以创建域名列表文件domains.txt:
example.com
*.example.com
test.example.net
*.test.example.net
然后使用以下命令批量生成TXT记录:
acme.sh --issue --dns --domains-from-file domains.txt --output-txt dns_challenge_all.txt
这种方式特别适合管理多个客户域名的开发者或运维人员。
3. 错误处理与日志分析
证书申请失败时,可通过以下方式排查问题:
- 查看详细日志:
acme.sh --issue --dns -d example.com --debug 2
- 常见错误及解决方法:
| 错误类型 | 可能原因 | 解决方法 |
|---|---|---|
| 验证超时 | TXT记录未生效、DNS缓存 | 等待DNS刷新、检查记录值是否正确 |
| 记录不匹配 | TXT值错误、多域名记录混淆 | 核对记录值、使用--output-txt区分记录 |
| 权限不足 | 证书目录无写入权限 | 修改目录权限或指定其他目录 |
通知脚本目录提供了多种通知方式,可在验证失败时发送提醒,例如对应脚本和对应脚本。
总结与展望
本文详细介绍了acme.sh DNS手动模式的非交互式实现方法,通过输出TXT记录文件、自定义DNS更新脚本和自动验证流程,解决了无API场景下的证书申请难题。关键要点包括:
- DNS手动模式适用于无API支持的域名和安全限制环境
- 使用
--output-txt参数实现非交互式记录管理 - 结合自定义脚本可实现完全自动化的证书申请流程
- 多域名批量处理和错误处理是生产环境的关键需求
随着ACME协议的不断发展,未来DNS验证流程可能会更加简化。acme.sh项目也在持续更新中,建议定期升级以获取最新功能:
acme.sh --upgrade
如果你在使用过程中遇到问题,可查阅项目Wiki或提交Issue获取帮助。希望本文能帮助你在各种复杂环境中顺利部署HTTPS证书,提升网络服务的安全性。
点赞收藏本文,关注后续《acme.sh证书自动更新最佳实践》,深入探讨证书生命周期管理与灾备方案。
【免费下载链接】acme.sh 项目地址: https://gitcode.com/gh_mirrors/acm/acme.sh
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



