☰
使用 lego 与 Metaregistrar DNS 提供商签发通配符证书:配置、原理与实战指南
2026/9/25 4:07:36 网站建设 项目流程
  • 网络安全
  • 密码学

【免费下载链接】lego

Let's Encrypt/ACME client and library written in Go

项目地址:https://gitcode.com/gh_mirrors/le/lego
点击查看免费下载

本文是 lego(Go 语言实现的 Let's Encrypt/ACME 客户端与库)中Metaregistrar DNS 提供商的完整使用指南。Metaregistrar 是一个荷兰域名注册商,其 API 支持通过 DNS TXT 记录完成 ACME DNS-01 挑战,非常适合签发*.example.com这类通配符证书。读完本文,你将掌握METAREGISTRAR_API_TOKEN等全部环境变量的配置方法、lego run --dns metaregistrar的完整命令行用法,以及该提供商在 lego 源码中"写记录→等传播→删记录"的底层实现原理。

一、Metaregistrar 提供商概览

Metaregistrar 是 lego 官方支持的 DNS-01 挑战提供商之一,相关信息如下:

  • 提供商代码:metaregistrar
  • 引入版本:v4.23.0
  • 官方主页:https://metaregistrar.com/
  • API 文档:https://metaregistrar.dev/docu/metaapi/

在 providers/dns/metaregistrar/metaregistrar.toml 中定义了该提供商的元信息,而文档 docs/content/dns/zz_gen_metaregistrar.md 即由该 TOML 文件自动生成,两者内容保持一致。

在 providers/dns/zz_gen_dns_providers.go 中,metaregistrar被注册到提供商分发逻辑中,CLI 通过--dns metaregistrar即可直接选用,无需额外编译开关。

二、获取 API Token

使用 Metaregistrar 提供商前,需要在其管理后台生成一个 API Token:

  1. 登录 Metaregistrar 账户;
  2. 在 API 相关设置中创建/获取用于 MetaAPI 的 token;
  3. 将该 token 的值通过环境变量METAREGISTRAR_API_TOKEN提供给 lego。

三、快速开始:一条命令签发证书

最直接的使用方式是 CLI 命令行。以下示例同时申请*.example.com与example.com两个域名(通配符域名必须使用 DNS 挑战):

METAREGISTRAR_API_TOKEN="xxxxxxxxxxxxxxxxxxxxx" \ lego run --dns metaregistrar -d '*.example.com' -d example.com

命令要点:

  • --dns metaregistrar:指定 DNS-01 挑战使用 Metaregistrar 提供商;
  • -d '*.example.com':通配符域名必须加引号,防止 shell 展开;
  • 同时申请example.com与*.example.com时,ACME 会为两者分别颁发证书(通常需要两个独立的订单/证书,或使用 SAN 证书,具体取决于 ACME CA 策略);
  • METAREGISTRAR_API_TOKEN需要在实际运行时替换为真实 token。

若你更习惯使用配置文件(.lego.yml)而非命令行环境变量,可在配置中为metaregistrar指定envFile指向的 dotenv 文件,详见 docs/content/dns/_index.md 中关于 dotenv 与配置文件的说明。

四、全部环境变量与参数说明

Metategistrar 提供商共使用 5 个环境变量:1 个必填凭据 + 4 个可选调优参数。

4.1 凭据(必填)

环境变量名说明
METAREGISTRAR_API_TOKENMetaAPI 的 API token(必填)

在源码 providers/dns/metaregistrar/metaregistrar.go 中,NewDNSProvider()通过env.Get(EnvToken)读取该变量;若缺失,会返回错误:metaregistrar: some credentials information are missing: METAREGISTRAR_API_TOKEN。该行为由测试 metaregistrar_test.go 中的missing credentials用例验证。

4.2 可选调优参数

环境变量名说明默认值
METAREGISTRAR_HTTP_TIMEOUTAPI 请求超时时间(秒)30
METAREGISTRAR_POLLING_INTERVALDNS 传播检查的时间间隔(秒)2
METAREGISTRAR_PROPAGATION_TIMEOUT等待 DNS 传播的最大时长(秒)60
METAREGISTRAR_TTL用于 DNS 挑战的 TXT 记录 TTL(秒)120

这些默认值在 metaregistrar.go 的NewDefaultConfig()中与 lego dns01 包的全局默认值对齐:dns01.DefaultTTL = 120、dns01.DefaultPropagationTimeout = 60s、dns01.DefaultPollingInterval = 2s(见 challenge/dns01/dns_challenge.go)。

参数实际生效路径:

  • TTL会写入 TXT 记录的ttl字段(见下文Present逻辑);
  • HTTP_TIMEOUT被设置为http.Client的Timeout字段;
  • PROPAGATION_TIMEOUT与POLLING_INTERVAL由DNSProvider.Timeout()返回,供 lego 在等待 DNS 传播时使用(见 metaregistrar.go)。

调优建议:如果你的权威 DNS 更新较慢,可适当增大METAREGISTRAR_PROPAGATION_TIMEOUT(例如 120–300 秒);如果 API 响应较慢,可增大METAREGISTRAR_HTTP_TIMEOUT;TTL一般无需修改,保持 120 秒即可。

4.3 从文件读取凭据(_FILE后缀)

所有环境变量都支持_FILE后缀,用于从文件读取值,而不是直接写值。例如:

METAREGISTRAR_API_TOKEN_FILE=/path/to/metaregistrar-token \ lego run --dns metaregistrar -d example.com

其中/path/to/metaregistrar-token文件内容只能包含 token 值本身(不应包含换行外的额外内容或引号)。这种用法适合把敏感凭据放在权限受限的文件中,避免出现在 shell 历史记录或进程列表中。更多说明参见 docs/content/dns/_index.md 的 "Configuration and Credentials" 一节。

五、源码级原理:DNS-01 挑战的完整流程

Metaregistrar 提供商实现了 lego 的challenge.Provider接口(Present、CleanUp两个方法)以及challenge.ProviderTimeout接口(Timeout方法)。核心实现位于 providers/dns/metaregistrar/metaregistrar.go。

5.1 Present:写入 TXT 记录

当 ACME 服务器下发 DNS-01 挑战后,lego 调用Present:

  1. 通过dns01.GetChallengeInfo(ctx, domain, keyAuth)计算挑战记录值info.Value与完整记录名info.EffectiveFQDN;
  2. 调用dns01.DefaultClient().FindZoneByFqdn()依据 FQDN 反查权威区(zone),例如_acme-challenge.example.com对应区example.com;
  3. 构造DNSZoneUpdateRequest,其Add字段包含一条 TXT 记录:
    • Name:去掉末尾点后的完整挑战记录名(如_acme-challenge.example.com);
    • Type:TXT;
    • TTL:来自METAREGISTRAR_TTL;
    • Content:挑战值info.Value;
  4. 调用client.UpdateDNSZone()向 API 发送 PATCH 请求完成写入。

对应代码见 metaregistrar.go。

5.2 等待传播

Present完成后,lego 依据Timeout()返回的(PropagationTimeout, PollingInterval)周期性查询 DNS,确认 TXT 记录在全球权威 DNS 中可见后才向 ACME 服务器确认挑战完成。

5.3 CleanUp:删除 TXT 记录

挑战完成后,lego 调用CleanUp清理记录:构造DNSZoneUpdateRequest,将记录放入Remove字段(注意Content使用strconv.Quote(info.Value)加引号,以匹配权威 DNS 对 TXT 记录的存储格式),再次 PATCH 删除。对应代码见 metaregistrar.go。

5.4 底层 HTTP 客户端

与 Metaregistrar MetaAPI 交互的客户端位于 providers/dns/metaregistrar/internal/client.go:

  • 基础 URL 固定为https://api.metaregistrar.com;
  • token 通过 HTTP 头token传递(见do()方法中的req.Header.Add(tokenHeader, c.token));
  • 更新 DNS 区的端点路径为dnszone/{domain},使用PATCH方法提交 JSON;
  • 非 200 状态码会解析响应体中的错误结构并返回APIError,其字段定义见 internal/types.go,可覆盖status、error、errorCode、message、errorMessage等文档内/未文档化的字段。

请求/响应 JSON 结构示例可参考测试夹具 internal/fixtures/update-dns-zone.json(成功响应:status: ok)与 internal/fixtures/error.json(错误响应:invalid_token)。

六、以库方式集成(Go 代码)

除了 CLI,lego 也支持以 Go 库的方式使用 Metaregistrar 提供商。核心入口是NewDNSProviderConfig,可完全用代码控制全部参数:

package main import ( "github.com/go-acme/lego/v5/providers/dns/metaregistrar" ) func main() { config := metaregistrar.NewDefaultConfig() config.APIToken = "xxxxxxxxxxxxxxxxxxxxx" provider, err := metaregistrar.NewDNSProviderConfig(config) if err != nil { // 处理错误:token 为空时会返回 "metaregistrar: token missing" panic(err) } _ = provider }

注意:config == nil时会返回错误metaregistrar: the configuration of the DNS provider is nil,因此务必先通过NewDefaultConfig()构造配置对象(见 metaregistrar.go)。

NewDNSProvider()则适合直接从环境变量读取全部配置的场景,其行为与 CLI 完全一致。

七、常见问题与故障排查

Q1:报错some credentials information are missing: METAREGISTRAR_API_TOKEN说明METAREGISTRAR_API_TOKEN未设置或为空。检查环境变量是否已导出,或在命令前以内联方式赋值。

Q2:报错token missing使用NewDNSProviderConfig时传入的config.APIToken为空字符串。确保从配置/密钥管理系统中读取到了有效 token。

Q3:API 返回invalid_tokentoken 无效或已过期,需在 Metaregistrar 后台重新生成。

Q4:等待传播超时(60 秒默认值不够)权威 DNS 更新较慢时,调大METAREGISTRAR_PROPAGATION_TIMEOUT,例如:

METAREGISTRAR_API_TOKEN="xxxx" \ METAREGISTRAR_PROPAGATION_TIMEOUT=300 \ lego run --dns metaregistrar -d '*.example.com'

Q5:如何确认挑战记录已生效?可在等待期内手动查询:

dig TXT _acme-challenge.example.com @8.8.8.8

八、总结

Metaregistrar DNS 提供商是 lego 中结构清晰、接入简单的 DNS-01 提供商之一:只需一个METAREGISTRAR_API_TOKEN即可签发通配符证书,另有 4 个可选参数用于控制超时与 TTL。从源码看,其"PATCH 写入 TXT → 轮询传播 → PATCH 删除"的实现与 lego 的标准 DNS 挑战流程完全一致,并有对应的单元测试(凭据校验)与 live 测试(TestLivePresent/TestLiveCleanUp,需真实 token 才会运行)兜底,可靠性有保障。

如果你想深入了解 lego 的 DNS-01 挑战机制,可继续阅读 challenge/dns01 目录下的实现与文档 docs/content/obtain/dns01.md。

  • 网络安全
  • 密码学

【免费下载链接】lego

Let's Encrypt/ACME client and library written in Go

项目地址:https://gitcode.com/gh_mirrors/le/lego
点击查看免费下载
上一篇:DamaiHelper:让技术普惠大众的智能预约自动化工具
下一篇:Cherry Studio 每条消息成本与缓存/推理 Token 计数:基于 ai_usage_record 的用量分解与成本计算解析

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询