使用 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),仅供参考

相关新闻

Two.js 安全指南:客户端渲染库的 SVG 攻击面、CSP 加固与漏洞报告流程

Two.js 安全指南:客户端渲染库的 SVG 攻击面、CSP 加固与漏洞报告流程

图形学前端 【免费下载链接】two.js A renderer agnostic two-dimensional drawing api for the web 项目地址: https://gitcode.com/gh_mirrors/tw/two.js 点击查看 免费下载 Two.js 是一个渲染器无关的二维绘图 API,它会在浏览器中以 Canvas、SVG 或 …

2026/9/25 5:32:27 阅读更多 →
PaddleSeg FastFCN 实战指南:JPU 联合金字塔上采样与语义编码模块的源码级解析

PaddleSeg FastFCN 实战指南:JPU 联合金字塔上采样与语义编码模块的源码级解析

人工智能计算机视觉预训练 【免费下载链接】PaddleSeg Easy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting,…

2026/9/25 5:32:26 阅读更多 →
CodeCombat AP CSP 第二单元“Hitchhiker‘s Guide“算法活动详解:不可解问题、不可判定问题与停机问题

CodeCombat AP CSP 第二单元“Hitchhiker‘s Guide“算法活动详解:不可解问题、不可判定问题与停机问题

游戏开发教育前端后端 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 点击查看 免费下载 本文围绕 CodeCombat AP Computer Science Principles(AP CSP)课程中的活动…

2026/9/25 5:32:26 阅读更多 →

最新新闻

基于机器学习的蛋白质亚细胞定位预测:从序列到分类的完整流程

基于机器学习的蛋白质亚细胞定位预测:从序列到分类的完整流程

简介:这份PDF文献面向生物信息学、蛋白质组学方向的学习者与研究者,聚焦机器学习方法在蛋白质亚细胞定位预测中的应用,帮助读者理解如何从蛋白质序列中提取特征并完成多分类预测,适合具备一定机器学习与生物学基础的读者参考。资源…

2026/9/25 6:29:04 阅读更多 →
Windows高性能模式深度调优:从电源策略到散热协同

Windows高性能模式深度调优:从电源策略到散热协同

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:29:03 阅读更多 →
GB/T27930-2015车桩通信协议实战解析:从CAN报文到故障诊断

GB/T27930-2015车桩通信协议实战解析:从CAN报文到故障诊断

1. 为什么我把GB/T27930当"车桩联调的第一道坎"来学先交代一下背景。我做充电桩嵌入式软件和BMS联调有几年了,头一次独立负责车桩联调时,手里只有一份协议PDF和一台上位机抓包工具。那时候最痛苦的还不是代码怎么写,而是报文到了总…

2026/9/25 6:29:03 阅读更多 →
悉尼大学DBMS课程实战指南:从SQL到事务恢复的底层认知

悉尼大学DBMS课程实战指南:从SQL到事务恢复的底层认知

简介:悉尼大学数据库管理系统课程资料,内容覆盖数据库核心理论与应用,适合正在学习数据库原理的高校学生、准备课程考试或希望系统复习数据库管理系统的技术人员。压缩包共65个文件,大小约17.04MB,以PDF课件和带答案的…

2026/9/25 6:29:02 阅读更多 →
计及光伏逆变器快速无功响应的分布式电源优化配置

计及光伏逆变器快速无功响应的分布式电源优化配置

1. 为什么传统分布式电源配置方案会“浪费”光伏的无功价值?先抛个实际场景。你在做一个园区或县域配电网的分布式电源规划,手里拿着几个光伏电站的接入申请,业主要求在满足电压质量的前提下尽量多装容量。于是你按常规思路建了个优化模型&am…

2026/9/25 6:29:02 阅读更多 →
STM32环境监测终端开源项目评测:DHT11与HC-SR04复现避坑指南

STM32环境监测终端开源项目评测:DHT11与HC-SR04复现避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:28:01 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →