- 网络安全
- 密码学
【免费下载链接】lego
Let's Encrypt/ACME client and library written in Go
本文是 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:
- 登录 Metaregistrar 账户;
- 在 API 相关设置中创建/获取用于 MetaAPI 的 token;
- 将该 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_TOKEN | MetaAPI 的 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_TIMEOUT | API 请求超时时间(秒) | 30 |
METAREGISTRAR_POLLING_INTERVAL | DNS 传播检查的时间间隔(秒) | 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:
- 通过
dns01.GetChallengeInfo(ctx, domain, keyAuth)计算挑战记录值info.Value与完整记录名info.EffectiveFQDN; - 调用
dns01.DefaultClient().FindZoneByFqdn()依据 FQDN 反查权威区(zone),例如_acme-challenge.example.com对应区example.com; - 构造
DNSZoneUpdateRequest,其Add字段包含一条 TXT 记录:Name:去掉末尾点后的完整挑战记录名(如_acme-challenge.example.com);Type:TXT;TTL:来自METAREGISTRAR_TTL;Content:挑战值info.Value;
- 调用
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
相关推荐
lego 使用 Hosting.nl DNS 提供商签发通配符证书:配置、原理与实战
lego 使用 Hosting.nl DNS 提供商签发通配符证书:配置、原理与实战 导读 Hosting.nl 是 lego(Let's Encrypt/AC
网络安全密码学lego 使用 GoDaddy DNS 提供商签发证书:配置、原理与实战指南
lego 使用 GoDaddy DNS 提供商签发证书:配置、原理与实战指南 导读 本文讲解如何在 lego(Go 语言编写的 Let's Encrypt/AC
网络安全密码学AI SDK Cartesia Provider 能力全景:Sonic 语音合成与 Ink 2 实时转录的版本演进与源码级解析
AI SDK Cartesia Provider 能力全景:Sonic 语音合成与 Ink 2 实时转录的版本演进与源码级解析 @ai sdk/cartesia
网络安全密码学
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考