使用 lego 通过 Virtualname DNS 提供者签发通配符证书:从环境变量配置到源码级原理
网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载本文是 legoLets Encrypt/ACME 客户端中 Virtualname DNS 提供者的完整使用指南。Virtualname 是一家西班牙 DNS 托管服务从 lego v4.30.0 起支持通过其 API 完成 DNS-01 挑战从而为通配符域名自动签发证书。读完本文你将掌握 Virtualname 提供者的环境变量配置、命令行签发流程、调优参数含义以及其基于 Tecnocrática 共享客户端的底层实现原理。Virtualname 提供者是什么Virtualname 是 lego 内置的 DNS 提供者Provider之一代码名为virtualname自v4.30.0版本起可用。它通过 Virtualname 的 DNS API 自动创建、验证并删除用于 ACME DNS-01 挑战的 TXT 记录使 lego 能够在无需人工干预的情况下完成域名所有权验证并签发证书包括*.example.com这类通配符证书。该提供者的官方说明文档位于 docs/content/dns/zz_gen_virtualname.md其元数据定义在 providers/dns/virtualname/virtualname.toml 中。在 lego 的提供者注册表中virtualname已被映射到对应的构造函数见 providers/dns/zz_gen_dns_providers.go 中的case virtualname因此 CLI 可直接按名称启用。快速开始签发通配符证书使用 Virtualname 提供者签发证书的最小命令如下摘自官方文档VIRTUALNAME_TOKENxxxxxx \ lego run --dns virtualname -d *.example.com -d example.com命令要点VIRTUALNAME_TOKEN为你的 Virtualname API 令牌通过环境变量传入--dns virtualname指定使用 Virtualname 提供者完成 DNS-01 挑战同时传入-d *.example.com与-d example.com可在一张证书中同时包含通配符域名与裸域名ACME 要求裸域与通配符域同时验证因此不能省略裸域。命令执行后lego 会经历以下流程向 ACME 服务器注册订单 → 计算 DNS-01 挑战所需的 TXT 记录值 → 调用 Virtualname API 创建 TXT 记录 → 等待 DNS 传播 → 通知 ACME 服务器验证 → 验证通过后下载证书。凭证配置VIRTUALNAME_TOKEN提供者仅需要一个凭证环境变量环境变量名说明VIRTUALNAME_TOKENAPI 令牌API token从源码 providers/dns/virtualname/virtualname.go 可以看到环境变量命名空间统一为VIRTUALNAME_const ( envNamespace VIRTUALNAME_ EnvToken envNamespace TOKEN // ... )在NewDNSProvider()中如果VIRTUALNAME_TOKEN缺失或为空会直接返回错误values, err : env.Get(EnvToken) if err ! nil { return nil, fmt.Errorf(virtualname: %w, err) }对应的单元测试 providers/dns/virtualname/virtualname_test.go 也验证了这一行为缺失令牌时返回virtualname: some credentials information are missing: VIRTUALNAME_TOKEN。使用_FILE后缀从文件读取凭证所有环境变量都可以追加_FILE后缀改为从文件读取值。例如将令牌写入文件后echo -n xxxxxx /path/to/token.txt VIRTUALNAME_TOKEN_FILE/path/to/token.txt \ lego run --dns virtualname -d *.example.com -d example.com这一机制对 CI/CD 场景非常实用——避免把令牌直接暴露在命令行或环境变量中。有关 lego 环境变量与文件配置的完整约定参见 docs/content/dns/_index.md 中的 Configuration and Credentials 一节以及 docs/content/advanced/file-configuration.md。附加配置参数与调优除了令牌之外Virtualname 提供者还支持以下可选参数环境变量名说明默认值VIRTUALNAME_HTTP_TIMEOUTAPI 请求超时时间秒30VIRTUALNAME_POLLING_INTERVALDNS 传播检查间隔秒10VIRTUALNAME_PROPAGATION_TIMEOUTDNS 传播最大等待时间秒300VIRTUALNAME_TTLDNS 挑战所用 TXT 记录的 TTL秒120这些默认值并非文档凭空而来而是直接编码在 providers/dns/virtualname/virtualname.go 的NewDefaultConfig()中func NewDefaultConfig() *Config { return Config{ TTL: env.GetOrDefaultInt(EnvTTL, dns01.DefaultTTL), PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, 5*time.Minute), PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, 10*time.Second), HTTPClient: http.Client{ Timeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second), }, } }几点源码级补充说明dns01.DefaultTTL在 challenge/dns01/dns_challenge.go 中定义为120即 TTL 默认值 120 秒的来源PROPAGATION_TIMEOUT默认 300 秒5 分钟、POLLING_INTERVAL默认 10 秒二者共同决定 lego 轮询 DNS 传播的节奏HTTP_TIMEOUT控制与 Virtualname API 交互的 HTTP 客户端超时。调优建议TTL如果 Virtualname 后台刷新速度较慢可适当调大VIRTUALNAME_TTL反之希望挑战尽快完成、TXT 记录尽快消失时可调小 TTL传播等待DNS 记录在权威服务器间同步耗时较长时可调大VIRTUALNAME_PROPAGATION_TIMEOUT避免 lego 因等待不足而误报失败所有参数同样支持_FILE后缀从文件读取。工作原理源码级解析Virtualname 提供者本身是一个薄封装其核心逻辑委托给共享的 Tecnocrática 客户端实现providers/dns/internal/tecnocratica/provider.goAPI 端点为https://api.virtualname.net/v1见 providers/dns/virtualname/virtualname.go 中的defaultBaseURL。创建 TXT 记录PresentPresent是 ACME 挑战生命周期中的置备阶段。其流程为由dns01.GetChallengeInfo计算挑战记录值与有效 FQDN通过FindZoneByFqdn查找域名所属的权威 DNS zone调用GetZones在 Virtualname 侧匹配 zone按name或human_name比对用ExtractSubDomain提取子域前缀构造TXT类型记录并调用CreateRecord创建将zoneID与recordID以挑战 token 为键存入内存 map供后续清理使用。record : internal.Record{ Name: subDomain, Type: TXT, Content: info.Value, TTL: d.config.TTL, } newRecord, err : d.client.CreateRecord(ctx, zone.ID, record)删除 TXT 记录CleanUp证书签发完成后lego 会调用CleanUp删除挑战 TXT 记录避免留下无用的 DNS 数据。它通过之前保存的zoneID/recordID调用DeleteRecord成功后从内存 map 中清除对应条目。传播等待TimeoutDNSProvider实现了challenge.ProviderTimeout接口func (d *DNSProvider) Timeout() (timeout, interval time.Duration) { return d.config.PropagationTimeout, d.config.PollingInterval }这正是VIRTUALNAME_PROPAGATION_TIMEOUT与VIRTUALNAME_POLLING_INTERVAL两个环境变量在运行时被消费的位置。底层 HTTP 客户端Tecnocrática 客户端providers/dns/internal/tecnocratica/internal/client.go使用X-TCpanel-Token请求头携带 API 令牌请求路径为GET /dns/zones—— 列出全部 zonePOST /dns/zones/{zoneID}/records—— 创建记录请求体为{record: {...}}DELETE /dns/zones/{zoneID}/records/{recordID}—— 删除记录。所有请求还会附加Accept: application/json头、lego 的 User-Agent 头并在响应状态码非 2xx 时返回带状态码与响应体的错误信息。在 Go 代码中集成使用除了 CLI你也可以在 Go 程序中将 Virtualname 提供者作为库使用。以下示例展示两种构造方式package main import ( log github.com/go-acme/lego/v5/providers/dns/virtualname ) func main() { // 方式一从环境变量 VIRTUALNAME_TOKEN 读取凭证 provider, err : virtualname.NewDNSProvider() if err ! nil { log.Fatal(err) } // 方式二显式传入配置可覆盖默认 TTL、超时等 config : virtualname.NewDefaultConfig() config.Token xxxxxx config.TTL 60 provider, err virtualname.NewDNSProviderConfig(config) if err ! nil { log.Fatal(err) } _ provider }Config类型直接复用了 Tecnocrática 的配置结构providers/dns/internal/tecnocratica/provider.go包含Token、PropagationTimeout、PollingInterval、TTL、HTTPClient五个字段与上文的四个环境变量一一对应。之后将provider传入 lego 的Certificate.Obtain流程即可。若config为 nil构造会返回virtualname: the configuration of the DNS provider is nil错误若Token为空则返回virtualname: missing credentials——这两条错误信息同样由单元测试覆盖。验证与测试providers/dns/virtualname/virtualname_test.go 提供了三类测试TestNewDNSProvider验证环境变量正常/缺失两种情况TestNewDNSProviderConfig验证显式配置的正常/缺失令牌两种情况TestLivePresent/TestLiveCleanUp真实调用 Virtualname API 的现场测试需要设置VIRTUALNAME_DOMAIN环境变量并仅在开启 live 测试标记时运行分别验证 TXT 记录的创建与清理。这些测试是排查为什么我的配置不生效时的最佳参照——它们精确列出了每种失败场景下的错误文案。注意事项Virtualname 提供者自v4.30.0起才可用请确认你的 lego 版本不低于该版本通配符证书-d *.example.com必须同时包含裸域名否则 ACME 校验会失败API 令牌应妥善保管优先通过VIRTUALNAME_TOKEN_FILE或安全的密钥管理服务注入避免提交到版本库本文所有默认值与行为均以当前仓库源码为准v5 版本线若升级 lego 版本请以对应版本的文档与源码为准。参考资料提供者官方文档docs/content/dns/zz_gen_virtualname.md提供者实现providers/dns/virtualname/virtualname.go共享客户端实现providers/dns/internal/tecnocratica/provider.go 与 providers/dns/internal/tecnocratica/internal/client.go单元测试providers/dns/virtualname/virtualname_test.go环境变量与文件配置约定docs/content/dns/_index.md、docs/content/advanced/file-configuration.md赞分享网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载相关推荐GenericAgent 桌面宠物系统皮肤包格式、Sprite 动画管线与 Hub 远程控制全解析GenericAgent 桌面宠物系统皮肤包格式、Sprite 动画管线与 Hub 远程控制全解析 GenericAgent 的 frontends/desk网络安全密码学使用 lego 的 ScanNet DNS 提供器签发通配符证书环境变量配置与源码原理解析使用 lego 的 ScanNet DNS 提供器签发通配符证书环境变量配置与源码原理解析 ScanNet 是 lego 内置的 DNS 01 挑战提供器之一网络安全密码学使用 lego 与 Core-Networks DNS 提供商签发通配符证书环境变量配置与源码级原理解析使用 lego 与 Core Networks DNS 提供商签发通配符证书环境变量配置与源码级原理解析 导读 Core Networkscode cor网络安全密码学上一篇StringManipulation对齐和格式化功能如何快速创建整齐的代码注释和文档下一篇FontStash内存优化技巧减少纹理占用和提升缓存效率创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

什么是文件「魔数」?从is-png-cj看懂PNG文件签名识别原理入门

什么是文件「魔数」?从is-png-cj看懂PNG文件签名识别原理入门

什么是文件「魔数」?从is-png-cj看懂PNG文件签名识别原理入门 【免费下载链接】is-png-cj 一个判断图片格式的库,根据图片的文件数据,判断图片是否为png格式 项目地址: https://gitcode.com/Cangjie-TPC/is-png-cj is-png-cj 是一个用…

2026/9/25 6:00:45 阅读更多 →
Oracle 19c时区补丁p31335037:TZV35升级与跨时区合规实践

Oracle 19c时区补丁p31335037:TZV35升级与跨时区合规实践

简介:本资源是Oracle Database 19c(19.0.0.0.190416DBRU)专用的时区版本35补丁包,专为解决ORA-39405错误及TSTZ时区版本不匹配问题设计,适用于已部署Oracle 19.3版本、需升级至Timezone File v35的DBA与数据库运维人员…

2026/9/25 6:00:45 阅读更多 →
950 个 Claude 连轴转 21 小时,在 DNA 里发现了一个没人注意过的 CRISPR 亲戚

950 个 Claude 连轴转 21 小时,在 DNA 里发现了一个没人注意过的 CRISPR 亲戚

💡 一句话总结:Anthropic 用约 950 个 Claude 智能体从 20 多万条逆转录酶里筛出了一种带 CRISPR 样重复阵列的新酶系统 ART——功能还是谜,但「AI 规模化出假设、人类做实验验证」的闭环已经跑通;社区吵的「发现 vs 营销」&#…

2026/9/25 6:00:45 阅读更多 →

最新新闻

从免费CRM到独立部署:小团队搭建私人CRM网站全记录

从免费CRM到独立部署:小团队搭建私人CRM网站全记录

上个月我终于把客户资料从微信聊天记录、Excel表格和记事本里统一搬了出来,全部塞进了一套自己部署的CRM系统里。项目代号DeskcommCRM,听起来像个大厂产品,其实是我基于开源组件和一台轻量云服务器搭起来的私人客户关系管理网站。到今天跑了1…

2026/9/25 12:52:24 阅读更多 →
逐行精读Tftpd64的tftpd_thread.c:TFTP状态机、OACK选项协商与重传策略完整实现

逐行精读Tftpd64的tftpd_thread.c:TFTP状态机、OACK选项协商与重传策略完整实现

逐行精读Tftpd64的tftpd_thread.c:TFTP状态机、OACK选项协商与重传策略完整实现 【免费下载链接】tftpd64 The working repository of the famous TFTP server. 项目地址: https://gitcode.com/gh_mirrors/tf/tftpd64 Tftpd64 是 Windows 平台上最著名的 TFT…

2026/9/25 12:52:24 阅读更多 →
Large Language Models for Summarizing Czech Historical Documents and Beyond

Large Language Models for Summarizing Czech Historical Documents and Beyond

文章主要内容与创新点总结 一、主要内容 本文聚焦捷克语文本摘要任务,尤其是历史文献摘要这一研究缺口,展开了系统性研究,具体内容如下: 研究背景:文本摘要旨在精简文本同时保留核心信息,当前该领域研究多集中于英语等资源丰富语言,而捷克语(尤其是历史捷克语)因语言…

2026/9/25 12:52:24 阅读更多 →
Windows 8.1原版镜像下载与校验:MSDN正式版、SHA1验证及UEFI/GPT安装指南

Windows 8.1原版镜像下载与校验:MSDN正式版、SHA1验证及UEFI/GPT安装指南

隔三差五就有人来问我:网上那些 Windows 8.1 纯净版、完美优化版、一键装机版,到底能不能用?我的回答一直没变——如果你需要的是一个稳定的 Windows 8.1 镜像下载,就老老实实找微软官方原版,尤其是带 MSDN 正式版字样…

2026/9/25 12:52:24 阅读更多 →
自建CRM系统全攻略:从LNMP架构到数据安全运维

自建CRM系统全攻略:从LNMP架构到数据安全运维

先说个背景。去年团队规模从三个人扩到十来个人的时候,我们做的第一件事不是换办公室,而是认真解决客户信息管理的问题。之前客户资料全躺在个人微信、Excel 表格和邮箱里,每个人记法还不一样,有人记在备注里,有人单独建了个文档&…

2026/9/25 12:52:24 阅读更多 →
开放式代码评审实践:让每一行代码都被认真读过

开放式代码评审实践:让每一行代码都被认真读过

1. 开放式代码评审:让每一行代码都被认真读过先聊个场景。你花了几个小时写了一个功能,提交了合并请求,两天后评审人才姗姗来迟,留下一句“LGTM”就合入了。你心里清楚,这份代码里有几处设计瑕疵,有些边界条…

2026/9/25 12:51:23 阅读更多 →

日新闻

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/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

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

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 阅读更多 →