ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

使用 lego 与 myaddr.{tools,dev,io} 配置 DNS-01 挑战获取通配符证书

使用 lego 与 myaddr.{tools,dev,io} 配置 DNS-01 挑战获取通配符证书 网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载本文是基于 lego 开源 ACME 客户端库为 myaddr.{tools,dev,io} 动态 DNS 服务编写的 DNS-01 挑战配置实战指南。通过配置一个环境变量完成凭据映射、运行一条 lego 命令即可签发包含通配符域名在内的 Lets Encrypt 证书文章同时结合 myaddr provider 源码 与 API 客户端实现讲解凭据格式、各超时参数的默认值与底层行为方便读者在 CLI 与 Go 库两种使用方式间灵活切换。背景myaddr 提供什么能力myaddr.{tools,dev,io} 是一个面向动态 DNS 场景的服务其关键特性在于你无需持有传统 DNS 服务商的账号密码而是通过subdomain 与 private key 的映射来授权某个子域名的 TXT 记录写入。这使其特别适合家庭网络、服务器 IP 经常变化、或者只想对个别子域做 ACME 验证的场合。lego 在v4.22.0版本起内置了该 DNS providerprovider 代码标识为myaddr见 myaddr.toml。在 lego 中它由 zz_gen_dns_providers.go 统一注册命令行指定--dns myaddr即可启用。快速开始一条命令签发证书按照 myaddr.toml 中的示例最小可用的 CLI 命令如下MYADDR_PRIVATE_KEYS_MAPPINGexample:123,test:456 \ lego run --dns myaddr -d *.example.com -d example.com其中MYADDR_PRIVATE_KEYS_MAPPING是唯一必需的凭据环境变量格式为逗号分隔的subdomain:private_key对-d *.example.com -d example.com同时请求通配符证书与裸域名证书ACME 要求通配符域名必须与裸域名一同签发因此通常成对出现签发前请确保对应域名的 NS 记录已指向 myaddr 服务否则 lego 的 DNS 预检无法确认记录可被权威 DNS 解析。凭据配置子域名与私钥的映射环境变量环境变量名说明MYADDR_PRIVATE_KEYS_MAPPING子域名与私钥的映射格式为subdomain1:private_key1,subdomain2:private_key2,subdomain3:private_key3该变量是必填项。从源码看NewDNSProvider 通过env.Get(EnvPrivateKeysMapping)读取并检查该变量缺失时返回错误myaddr: some credentials information are missing: MYADDR_PRIVATE_KEYS_MAPPING随后调用 env.ParsePairs 解析映射以逗号切分每一对、以冒号切分键值并对键值做空白修剪因此example: 123这类带空格写法也能被正确解析。若某个 pair 不含冒号会报错incorrect pair: ...。映射键的匹配规则映射中的subdomain并非随意命名它必须与被验证域名去除权威 DNS 区域后剩下的那段子域精确匹配。以Present流程myaddr.go为例先通过dns01.GetChallengeInfo计算待写入的_acme-challenge记录完整 FQDN调用FindZoneByFqdn找到权威 DNS 区域例如对_acme-challenge.example.com区域为example.comdns01.ExtractSubDomain取出_acme-challenge这段前缀用strings.Cut去掉_acme-challenge.前缀得到example再以它为 key 在凭据映射中查找私钥internal/client.go。因此命令示例中的MYADDR_PRIVATE_KEYS_MAPPINGexample:123,test:456意味着example.com区域对应私钥123test对应私钥456。如果映射中找不到匹配的子域名客户端会返回错误subdomain xxx not found in credentials, check your credentials map该行为也被 client_test.go 中的测试用例覆盖。私钥如何使用拿到私钥后客户端向https://myaddr.tools/update端点发送 JSON POST 请求internal/client.go请求体结构定义在 internal/types.go{ key: 你的私钥, acme_challenge: TXT 记录值 }发送请求时客户端会设置Accept: application/json与Content-Type: application/json头非 2xx 响应会被包装为包含状态码与响应体的错误例如测试 fixtureinternal/fixtures/error.txt演示的 400 响应错误格式unexpected status code: [status code: 400] body: invalid value for key。每次调用AddTXTRecord时客户端通过sync.Mutex保护凭据映射的并发读取internal/client.go这暗示了 lego 在并行处理多个域名挑战时的线程安全考虑。附加配置超时与传播参数除凭据外还可通过以下环境变量调整 API 超时与 DNS 传播等待策略环境变量名说明MYADDR_HTTP_TIMEOUTAPI 请求超时时间秒默认 30MYADDR_POLLING_INTERVALDNS 传播检查间隔秒默认 2MYADDR_PROPAGATION_TIMEOUTDNS 传播最大等待时间秒默认 60MYADDR_SEQUENCE_INTERVAL顺序请求之间的间隔秒默认 2MYADDR_TTLDNS 挑战所用 TXT 记录的 TTL秒默认 120这些默认值在 NewDefaultConfig 中被明确赋值且与 lego 的 dns01 包默认常量DefaultPropagationTimeout 60s、DefaultPollingInterval 2s、DefaultTTL 120保持一致。参数读取通过 env.GetOrDefaultInt / env.GetOrDefaultSecond 完成数值型配置会被解析为秒级time.DurationMYADDR_HTTP_TIMEOUT用于构造 provider 内部的http.Client超时。这些参数的运行效果分别体现在两个接口方法上Timeout()返回(PropagationTimeout, PollingInterval)供 lego 决定“写入 TXT 后等待传播多久、每隔多久查询一次”myaddr.goSequential()返回SequenceInterval表明该 provider强制串行处理所有 DNS 挑战每次请求之间按此间隔节流myaddr.go。配置的_FILE后缀机制与 lego 其他 DNS provider 一致上述所有环境变量包括MYADDR_PRIVATE_KEYS_MAPPING都可以追加_FILE后缀改为指向一个文件由 lego 从文件中读取值。该机制由 env.GetOrFile 实现优先读取环境变量本身为空时尝试读取变量名_FILE指向的文件并去除末尾的换行符。典型用法适合 Docker/Kubernetes secret 挂载场景# 将映射写入文件后无需在命令行或镜像中明文暴露私钥 MYADDR_PRIVATE_KEYS_MAPPING_FILE/run/secrets/myaddr_mapping \ lego run --dns myaddr -d *.example.com -d example.com关于清理CleanUp与 TXT 记录的自动过期一个值得注意的实现细节myaddr provider 的CleanUp是一个空实现myaddr.go注释明确说明“myaddr API 没有删除 TXT 记录的端点记录会在数分钟后自动移除”。因此使用该 provider 时无需担心残留记录影响后续挑战——TXT 记录由服务端自动回收从 lego 的角度看这也意味着挑战流程少了一次 API 往返整体耗时更短。以 Go 库方式集成除了 CLImyaddr provider 也可直接作为 Go 库使用适合在自有程序中嵌入 ACME 签发逻辑。核心入口有两个NewDNSProvider()从环境变量读取配置并返回 provider 实例NewDNSProviderConfig(config *Config)直接传入 Config 结构体便于以编程方式注入凭据与参数例如在测试中通过 myaddr_test.go 所示的方式构造Config{Credentials: map[string]string{example: 123}}。Config中Credentials字段类型为map[string]string可直接复用env.ParsePairs的解析结果若传入nilNewDNSProviderConfig会返回错误myaddr: credentials missing对应 internal/client.go 的校验。成功构建后provider 即实现了 lego 的challenge.Provider接口可无缝接入 lego 的certificate签发流程。常见问题排查提示some credentials information are missing: MYADDR_PRIVATE_KEYS_MAPPING未设置必填凭据变量请先配置映射。提示incorrect pair: xxx映射中某项缺少冒号分隔符检查MYADDR_PRIVATE_KEYS_MAPPING的格式。提示subdomain xxx not found in credentials映射键与挑战子域名不匹配核对映射中的 subdomain 是否对应被验证域名的 DNS 区域前缀。提示unexpected status code: 400 ... invalid value for keymyaddr 服务端拒绝了请求通常是私钥错误可对照 internal/fixtures/error.txt 中的错误响应格式检查。通配符签发失败确认-d *.example.com与-d example.com成对出现且区域 NS 已指向 myaddr。更多信息本 provider 的配置元数据与示例见 providers/dns/myaddr/myaddr.toml完整实现见 providers/dns/myaddr/myaddr.go 与 内部 API 客户端相关测试见 myaddr_test.go 与 internal/client_test.go各 provider 通用配置机制含_FILE后缀与凭据约定参见 docs/content/dns/_index.md。赞分享网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载相关推荐lego 使用 DNScale DNS Provider 签发通配符证书DNS-01 挑战配置全指南lego 使用 DNScale DNS Provider 签发通配符证书DNS 01 挑战配置全指南 DNScale 是 legoLets Encrypt网络安全密码学lego 使用 freemyip.com 签发通配符证书DNS-01 挑战完整配置指南lego 使用 freemyip.com 签发通配符证书DNS 01 挑战完整配置指南 本篇指南讲解如何在 legoGo 语言实现的 Lets Encry网络安全密码学ScyllaDB Counter 深入解析分片表示、读写流程与源码实现ScyllaDB Counter 深入解析分片表示、读写流程与源码实现 ScyllaDB 的 Counter计数器是一种只能在原有值上增加、减少或读取的特网络安全密码学上一篇Marlin固件中STM32F407VE风扇PWM控制异常深度解析与解决方案下一篇PhoenixGo与GoReviewPartner集成自动化批量分析SGF棋谱的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表