尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

使用 lego 通过 Domeneshop 完成 DNS-01 挑战:凭证配置、超时调优与源码实现解析

发布时间:2026/9/24 19:54:32

资讯中心
01
ARTICLE

使用 lego 通过 Domeneshop 完成 DNS-01 挑战:凭证配置、超时调优与源码实现解析

使用 lego 通过 Domeneshop 完成 DNS-01 挑战:凭证配置、超时调优与源码实现解析
网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载导读Domeneshop也写作 Domainnameshop是挪威的一家域名与托管服务商。lego 项目从 v4.3.0 起内置了domeneshop这个 DNS 提供商用于在自动签发 Lets Encrypt 证书时解决 DNS-01 挑战通过 Domeneshop 公开 API 自动创建 / 删除_acme-challengeTXT 记录。本文将基于官方文档 docs/content/dns/zz_gen_domeneshop.md该文档由 providers/dns/domeneshop/domeneshop.toml 自动生成与仓库源码完整介绍凭证获取、环境变量配置、超时参数调优并深入解读其底层实现与测试用例帮助你真正把该提供商跑起来并理解其工作原理。一、Provider 基本信息项目值Code命令行使用名domeneshop别名domainnameshop引入版本v4.3.0支持挑战类型DNS-01TXT 记录实现源码providers/dns/domeneshop/domeneshop.go从源码结构看该提供商由两层组成对外暴露的 DNSProvider 负责与 lego 的挑战框架对接实现Present、CleanUp、Timeout等接口内部则封装了一个精简的 Domeneshop API 客户端 internal/client.go仅处理 ACME 场景所需的 TXT 记录增删操作。二、前置条件在使用该提供商前需要确认待签发证书的域名或其权威 DNS 区域托管在 Domeneshop且该域名在 Domeneshop 侧已启用 DNS 服务。这一点在源码中有明确校验internal.Client.GetDomainByName遍历域名列表时会跳过Services.DNS false的域名internal/client.go因为未启用 DNS 服务的域名无法添加记录。已拥有 Domeneshop API 凭证API token API secret。创建方法见 Domeneshop API 文档的 Authentication 章节凭证本质是一对用于 HTTP Basic Auth 的 token/secret 组合见下文源码解析。三、快速上手签发证书官方文档给出的典型用法如下通过环境变量注入凭证然后使用--dns domeneshop指定提供商DOMENESHOP_API_TOKENtoken \ DOMENESHOP_API_SECRETsecret \ lego run --dns domeneshop -d *.example.com -d example.com要点说明-d *.example.com签发通配符证书时必须走 DNS-01 挑战这是dns domeneshop的核心场景同时传入根域名example.com可以在一张证书里同时覆盖根域与所有子域命令执行过程中lego 会调用Present自动在 Domeneshop 创建 TXT 记录等待 DNS 传播验证通过后再调用CleanUp删除记录详见第五节。四、凭证与环境变量配置4.1 必填凭证环境变量名说明DOMENESHOP_API_SECRETAPI secretDOMENESHOP_API_TOKENAPI token两个变量缺一不可。源码中 NewDNSProvider 通过env.Get(EnvAPIToken, EnvAPISecret)一次性读取并校验缺失时会直接报错对应的测试用例 domeneshop_test.go 覆盖了四种情况两者齐全 → 创建成功两者都缺失 → 报错domeneshop: some credentials information are missing: DOMENESHOP_API_TOKEN,DOMENESHOP_API_SECRET仅缺 token → 报错并指明缺失项仅缺 secret → 同上。因此排查问题时先确认终端里两个变量都已正确 export或使用_FILE变体见 4.3。4.2 可选调优参数环境变量名说明默认值DOMENESHOP_HTTP_TIMEOUTAPI 请求超时时间秒30DOMENESHOP_POLLING_INTERVAL两次 DNS 传播检测之间的间隔秒20DOMENESHOP_PROPAGATION_TIMEOUT等待 DNS 传播的最长时间秒300这些默认值在 NewDefaultConfig 中均有对应实现且与Timeout()接口直接挂钩Timeout()返回的(timeout, interval)就是PropagationTimeout与PollingIntervaldomeneshop.golego 将依据这两个值决定轮询_acme-challengeTXT 记录何时在全球 DNS 中生效。调优建议依据源码默认行为推断若你的 DNS 服务商传播较慢可调大DOMENESHOP_PROPAGATION_TIMEOUT避免在 300 秒内未生效时签发失败若想加快签发速度可适当调小DOMENESHOP_POLLING_INTERVAL20 秒是相对保守的轮询间隔DOMENESHOP_HTTP_TIMEOUT只影响与 API 的单次请求时长一般无需修改。4.3_FILE后缀用文件代替值文档明确说明环境变量名可通过_FILE后缀改为引用文件而不是直接写值。例如DOMENESHOP_API_TOKEN_FILE/run/secrets/domeneshop_token \ DOMENESHOP_API_SECRET_FILE/run/secrets/domeneshop_secret \ lego run --dns domeneshop -d *.example.com -d example.com这在 Docker/Kubernetes Secret 挂载等场景下非常实用。该机制由 lego 统一的 platform/env/env.go 实现优先读取KEY本身为空时再尝试读取KEY_FILE指向的文件内容并自动去除结尾的换行符strings.TrimRight(..., \r\n)。注意当KEY与KEY_FILE同时存在时直接的环境变量值优先。4.4 使用配置文件File Configuration除环境变量外lego 还支持基于 YAML 的 文件配置模式lego run --config config.yml。在文件配置中同样使用DOMENESHOP_*命名空间下的键来提供凭证与调优参数适合需要把证书签发参数化、版本化的团队。更完整的通用凭证与配置约定可参见 DNS 提供商总览文档。五、工作原理Present / CleanUp 与 API 交互5.1 挑战记录的生命周期DNSProvider实现了 lego 挑战框架要求的两个核心方法domeneshop.goPresent(ctx, domain, _, keyAuth)签发前调用。流程为——用dns01.GetChallengeInfo根据域名与keyAuth计算出挑战记录内容splitDomain把完整挑战 FQDN 拆成「权威区域 zone」与「主机名 host」两部分基于 DNS 查询FindZoneByFqdnsplitDomainclient.GetDomainByName找到对应的域名对象client.CreateTXTRecord在host上写入 TXT 记录。CleanUp(ctx, domain, _, keyAuth)验证完成后调用按相同的 zone/host 拆解逻辑定位域名再按「host 记录内容」双重匹配删除对应记录。5.2 底层 API 客户端internal/client.go 是对 Domeneshop APIhttps://api.domeneshop.no/v0的轻量封装关键实现细节认证方式每个请求通过req.SetBasicAuth(c.apiToken, c.apiSecret)设置 HTTP Basic Authclient.go即 token 作为用户名、secret 作为密码创建记录POST /domains/{domainId}/dns写入的记录固定为Type: TXT、TTL: 300CreateTXTRecord请求体结构可见测试夹具 create_record-request.json查询域名GET /domains返回结构见 getDomains.json其中services.dns用于过滤未启用 DNS 服务的域名删除记录先GET /domains/{domainId}/dns找到Host与Data都匹配的记录再DELETE /domains/{domainId}/dns/{recordId}DeleteTXTRecord匹配逻辑见 getDNSRecordByHostData数据结构Domain/Service/DNSRecord的 JSON 字段定义在 internal/types.go。5.3 验证与测试仓库为 providers/dns/domeneshop/domeneshop_test.go 提供了两类测试单元测试TestNewDNSProvider/TestNewDNSProviderConfig校验凭证缺失时的报错行为与默认配置的生成在线测试live testTestLivePresent/TestLiveCleanUp会真实调用 API 写入123d这条挑战记录再删除需要设置真实凭证与DOMENESHOP_DOMAIN环境变量才会执行envTest.IsLiveTest()判定。如果你想在接入前做一次真实链路冒烟验证可以仿照这两个用例进行。六、以库的形式接入进阶用法除了 CLIlego 还提供 Go 库接口。若你在自己的程序里调用该提供商可以使用NewDNSProviderConfig传入一个 Config 结构体import github.com/go-acme/lego/v4/providers/dns/domeneshop config : domeneshop.NewDefaultConfig() config.APIToken your-token config.APISecret your-secret // 可选覆盖超时 // config.PropagationTimeout 10 * time.Minute // config.PollingInterval 10 * time.Second provider, err : domeneshop.NewDNSProviderConfig(config) if err ! nil { log.Fatal(err) }NewDNSProviderConfig会做两道校验domeneshop.goconfig 不能为 nilAPIToken与APISecret不能为空。同时注入的HTTPClient会被包上一层clientdebug.Wrap用于在LEGO_DEBUG开启时输出调试信息便于排查 API 交互问题。七、注意事项与常见问题凭证必填DOMENESHOP_API_TOKEN/DOMENESHOP_API_SECRET缺一不可缺失时报错信息会明确点名缺失的变量可按提示逐个核对。域名必须启用 DNS 服务GetDomainByName会跳过services.dns false的域名若报 failed to find matching domain name请先到 Domeneshop 控制台确认该域名的 DNS 服务状态。删除记录依赖内容匹配CleanUp按 host data 双重匹配删除如果挑战记录已被第三方手动修改可能匹配失败此时需人工清理残留 TXT 记录。通配符证书只能走 DNS-01-d *.example.com无法使用 HTTP-01必须搭配--dns这正是本提供商的使用场景。传播等待可调默认最多等 300 秒、每 20 秒检查一次遇到 timeout waiting for record 类错误时优先考虑调大DOMENESHOP_PROPAGATION_TIMEOUT。敏感信息保护生产环境推荐使用_FILE后缀从 Secret 文件注入凭证避免 token 出现在进程列表或 shell 历史中。赞分享网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载相关推荐Jekyll Gitbook 主题 LaTeX 数学公式指南MathJax 渲染公式一步到位Jekyll Gitbook 主题 LaTeX 数学公式指南MathJax 渲染公式一步到位 jekyll gitbook 是一款把 Jekyll 静态站点打网络安全密码学GetQzonehistory你的QQ空间时光机一键备份十年青春回忆GetQzonehistory你的QQ空间时光机一键备份十年青春回忆 你是否曾翻看QQ空间发现那些承载着青春记忆的说说和照片正在慢慢消失超过70%的QQ网络安全密码学marimo-pair 技能深度解析:AI 如何在 marimo 实时内核中安全地操作笔记本marimo pair 技能深度解析:AI 如何在 marimo 实时内核中安全地操作笔记本 marimo pair 是 marimo 内置给 AI 代理 编辑网络安全密码学上一篇终极Hyperscan部署指南从源码编译到生产环境的完整流程下一篇RVC-WebUI全攻略从安装到精通的语音转换神器指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。