lego 集成 DirectAdmin DNS 提供商:配置详解与 TXT 挑战实现原理
网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载本文是一份面向开发者的 DirectAdmin DNS 提供商Provider使用指南。基于 legoLets Encrypt/ACME 客户端与库官方文档 docs/content/dns/zz_gen_directadmin.md 及providers/dns/directadmin目录下的真实源码说明如何通过环境变量配置 DirectAdmin 凭据、通过--dns directadmin完成 ACME DNS-01 挑战以及该提供商在 lego 内部如何调用 DirectAdmin 的CMD_API_DNS_CONTROL接口增删 TXT 记录。读完本文你将能够为运行在 DirectAdmin 控制面板上的域名签发单域名与通配符证书并理解其底层工作原理。DirectAdmin 提供商概述DirectAdmin 是一款常见的服务器控制面板官方站点为 https://www.directadmin.com自带完整的 DNS 管理 API。lego 的 DirectAdmin 提供商Provider Codedirectadmin从v4.18.0版本开始提供用于通过 DNS-01 挑战方式验证域名所有权。与 HTTP-01 挑战需要在 Web 服务器上放置验证文件不同DNS-01 挑战要求在你的权威 DNS 区域中临时新增一条TXT记录。lego 会在挑战前调用 DirectAdmin API添加该 TXT 记录Present等待 DNS 传播完成后向 ACME 服务端验证最后在挑战结束后删除该记录CleanUp。该提供商的配置元数据定义在 providers/dns/directadmin/directadmin.toml 中并已注册进 lego 的 DNS 提供商调度表见 providers/dns/zz_gen_dns_providers.gocase directadmin: return directadmin.NewDNSProvider()。快速开始签发通配符证书以 DirectAdmin 官方文档给出的示例命令为基准使用环境变量传入 API 地址、用户名和密码即可对*.example.com与example.com同时发起证书签发DIRECTADMIN_API_URLhttp://example.com:2222 \ DIRECTADMIN_USERNAMExxxx \ DIRECTADMIN_PASSWORDyyy \ lego run --dns directadmin -d *.example.com -d example.com说明lego run会完成注册、签发与自动续期的完整流程如需查看所有可用参数可运行lego run --help。示例中同时传入*.example.com和example.com正是通配符证书的典型用法——ACME 要求通配符域名必须走 DNS-01 挑战。DIRECTADMIN_API_URL中:2222是 DirectAdmin 默认的控制面板端口实际地址以你的服务器配置为准务必确认该地址从 lego 运行所在主机可访问。凭据配置Credentialslego 的全部 DNS 提供商均通过环境变量注入凭据。DirectAdmin 提供商需要以下三个必填变量环境变量名说明DIRECTADMIN_API_URLAPI 的 URL如http://example.com:2222DIRECTADMIN_USERNAMEAPI 用户名DIRECTADMIN_PASSWORDAPI 密码这些变量名在源码中以常量形式定义在 providers/dns/directadmin/directadmin.go命名空间前缀DIRECTADMIN_并由NewDNSProvider()通过env.Get(EnvAPIURL, EnvUsername, EnvPassword)一次性读取缺少任何一个变量都会返回形如directadmin: some credentials information are missing: DIRECTADMIN_API_URL的错误该行为由 directadmin_test.go 的用例逐项验证。使用_FILE后缀引用文件所有环境变量包括下文的附加配置项都可以通过_FILE后缀改为从文件读取从而避免在 shell 历史或进程列表中泄露密钥。例如DIRECTADMIN_API_URL_FILE/path/to/api_url \ DIRECTADMIN_USERNAME_FILE/path/to/username \ DIRECTADMIN_PASSWORD_FILE/path/to/password \ lego run --dns directadmin -d *.example.com其中每个文件内容仅允许包含该变量的值本身不要包含换行或多余字符。这一机制的通用说明见 docs/content/dns/_index.mdConfiguration and Credentials一节实现上由platform/env的GetOrFile系列函数支撑例如env.GetOrFile(EnvZoneName)见 directadmin.go。使用 dotenv 文件当使用配置文件或希望集中管理变量时可以用--env-file指定 dotenv 文件lego run --dns directadmin --domains example.org --domains *.example.org --env-file .env.directadmin.env.directadmin内容示例DIRECTADMIN_API_URLhttp://example.com:2222 DIRECTADMIN_USERNAMExxxx DIRECTADMIN_PASSWORDyyy该方式同样适用于通过 lego 配置文件.lego.yml为 DNS 挑战块指定envFile的场景具体约定参见 docs/content/dns/_index.md。附加配置项Additional Configuration除凭据外DirectAdmin 提供商还支持以下可调参数均通过环境变量注入环境变量名说明默认值DIRECTADMIN_HTTP_TIMEOUTAPI 请求超时时间秒30DIRECTADMIN_POLLING_INTERVALDNS 传播检查间隔秒5DIRECTADMIN_PROPAGATION_TIMEOUTDNS 传播最大等待时间秒60DIRECTADMIN_TTL挑战 TXT 记录的 TTL秒30DIRECTADMIN_ZONE_NAME用于添加 TXT 记录的 Zone 名称自动探测这些默认值与源码中NewDefaultConfig()的实现一一对应directadmin.gofunc NewDefaultConfig() *Config { return Config{ ZoneName: env.GetOrFile(EnvZoneName), TTL: env.GetOrDefaultInt(EnvTTL, 30), PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, 60*time.Second), PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, 5*time.Second), HTTPClient: http.Client{ Timeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second), }, } }参数配置示例DIRECTADMIN_API_URLhttp://example.com:2222 \ DIRECTADMIN_USERNAMExxxx \ DIRECTADMIN_PASSWORDyyy \ DIRECTADMIN_TTL60 \ DIRECTADMIN_POLLING_INTERVAL10 \ DIRECTADMIN_PROPAGATION_TIMEOUT120 \ DIRECTADMIN_HTTP_TIMEOUT60 \ lego run --dns directadmin -d *.example.com参数语义与调优建议DIRECTADMIN_TTL控制写入的 TXT 记录 TTL。该值通过internal.Record的TTL字段随 API 请求一起提交见下文。TTL 越大解析缓存生效时间越长可能拖慢挑战完成。DIRECTADMIN_PROPAGATION_TIMEOUT与DIRECTADMIN_POLLING_INTERVALlego 在写入记录后会轮询公共 DNS 直到记录可见。DNSProvider实现了challenge.ProviderTimeout接口其Timeout()方法直接返回这两个配置directadmin.go。如果你的权威 NS 或公共解析器响应较慢可适当调大超时。DIRECTADMIN_ZONE_NAME默认情况下 lego 通过dns01.DefaultClient().FindZoneByFqdn()根据待验证域名自动反查权威 Zone见getZoneName实现directadmin.go。当自动探测失败或你的 DirectAdmin 中所管理的 Zone 名称与公开 SOA 记录不一致时可以显式指定例如DIRECTADMIN_ZONE_NAMEexample.com。注意代码中dns01.UnFqdn(authZone)会去掉域名末尾的点。工作原理从 Present 到 CMD_API_DNS_CONTROL为了帮助你排查问题和评估安全性这里结合源码梳理一次 DNS-01 挑战中该提供商的完整调用链。1. Present写入挑战 TXT 记录Present()directadmin.go执行以下步骤通过dns01.GetChallengeInfo(ctx, domain, keyAuth)计算挑战记录EffectiveFQDN_acme-challenge.domain与ValuekeyAuth的摘要调用getZoneName确定权威 Zone优先使用ZoneName配置否则自动反查用dns01.ExtractSubDomain从完整 FQDN 中剥离出子域前缀即_acme-challenge部分组装internal.Record{Name, Type: TXT, Value, TTL}并调用client.SetRecord写入。SetRecordinternal/client.go将记录序列化为表单字段后追加actionadd然后发起请求。2. 底层 HTTP 请求细节所有写操作最终汇入Client.do()internal/client.go其请求特征端点BASE_URL/CMD_API_DNS_CONTROLDirectAdmin 标准 DNS 控制 API方法POSTContent-Type: application/x-www-form-urlencoded认证HTTP Basic Authreq.SetBasicAuth(c.username, c.password)查询参数domainzonejsonyes请求 JSON 响应表单字段name、type、value、ttl、action错误处理非 200 响应会被解析为 JSON 格式的APIErrorerror/result字段返回如[status code 500] Cannot View Dns Record: OOPS的错误。internal.Record的定义见 internal/types.go字段与表单名一一对应。上述请求形态均由 internal/client_test.go 中的 mock 测试精确验证包括domain、jsonyes、actionadd、name/type/value/ttl等严格匹配。3. CleanUp挑战完成后清理记录CleanUp()directadmin.go与Present对称重新计算EffectiveFQDN与子域组装Record注意此时不携带TTL调用client.DeleteRecord即actiondelete。即使挑战中途失败lego 也会尽力调用CleanUp清理残留 TXT 记录。以库的方式使用Go 编程接口除了 CLI你还可以把 DirectAdmin 提供商嵌入自己的 Go 程序。lego 通过lego.NewClientclient.Challenge.AddDNS01Provider组合使用提供商侧提供两个构造入口import ( github.com/go-acme/lego/v4/providers/dns/directadmin github.com/go-acme/lego/v4/lego github.com/go-acme/lego/v4/registration ) // 方式一从环境变量读取 DIRECTADMIN_API_URL / DIRECTADMIN_USERNAME / DIRECTADMIN_PASSWORD provider, err : directadmin.NewDNSProvider() if err ! nil { // 缺少凭据时返回 directadmin: some credentials information are missing: ... } // 方式二编程方式注入配置 config : directadmin.NewDefaultConfig() config.BaseURL http://example.com:2222 config.Username xxxx config.Password yyy config.TTL 60 provider, err directadmin.NewDNSProviderConfig(config) if err ! nil { // 校验失败时返回 directadmin: missing API URL 等错误 }注意NewDNSProviderConfig会进行必要的参数校验BaseURL为空返回directadmin: missing API URL用户名或密码缺失返回directadmin: some credentials information are missing见 directadmin.go。上述两种入口的成功与失败分支均有对应的单元测试覆盖directadmin_test.go。常见问题排查要点提示some credentials information are missing逐一确认DIRECTADMIN_API_URL、DIRECTADMIN_USERNAME、DIRECTADMIN_PASSWORD三个变量都已正确导出测试用例证明缺任意一个都会失败。提示missing API URL检查 URL 是否拼写完整包含协议与端口例如http://example.com:2222。API 返回 500 /Cannot View Dns Record通常是 DirectAdmin 账号权限不足或登录信息有误错误信息中会带上error与result字段便于排查参见 internal/types.go 与 client_test.go 的错误路径测试。Zone 自动探测失败为待验证域名设置正确的 NS 记录并确保公网可解析仍失败则显式设置DIRECTADMIN_ZONE_NAME。超时类问题DNS 传播较慢时增大DIRECTADMIN_PROPAGATION_TIMEOUT同时可适当降低DIRECTADMIN_POLLING_INTERVAL提高轮询频率。更多信息DirectAdmin 官方 API 文档https://www.directadmin.com/api.php重点可关注CMD_API_DNS_CONTROL的add/delete动作提供商配置元数据与示例providers/dns/directadmin/directadmin.toml提供商主实现providers/dns/directadmin/directadmin.goAPI 客户端实现providers/dns/directadmin/internal/client.go单元测试含 mock 断言providers/dns/directadmin/internal/client_test.go所有 DNS 提供商的通用配置_FILE后缀、dotenv、配置文件约定docs/content/dns/_index.md赞分享网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载相关推荐lego 使用 dnsHome.de 作为 DNS-01 挑战提供商配置指南与实现原理lego 使用 dnsHome.de 作为 DNS 01 挑战提供商配置指南与实现原理 dnsHome.de 是 lego 内置的 DNS 提供商之一通过其网络安全密码学使用 lego 的 Gehirn DNS 提供商解决 DNS-01 挑战配置、凭据与源码原理使用 lego 的 Gehirn DNS 提供商解决 DNS 01 挑战配置、凭据与源码原理 本篇技术指南聚焦 legoGo 编写的 Lets Encry网络安全密码学lego 集成 Derak Cloud DNS 提供者DNS-01 挑战配置指南与源码实现解析lego 集成 Derak Cloud DNS 提供者DNS 01 挑战配置指南与源码实现解析 本篇文章以 lego 项目内置的 Derak Cloud DN网络安全密码学上一篇三步快速上手Windows微信群发工具告别手动发送的终极解决方案下一篇猫抓(cat-catch)资源嗅探扩展三步解决网页媒体下载难题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考