网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载本文以 legoLets Encrypt/ACME 客户端与 Go 库内置的 Hosttech DNS Provider代码名hosttech自 v4.5.0 起提供为主体讲解如何利用 Hosttech 的 API 自动完成 DNS-01 挑战所需的 TXT 记录创建与清理实现通配符证书的自动化签发。读完本文你将掌握 Hosttech Provider 的环境变量配置、参数调优方法并理解其底层 API 调用链与凭据校验逻辑可直接将其用于 CLI 或作为 Go 库集成。背景lego 与 Hosttech Providerlego 是使用 Go 编写的 ACME 客户端与库当前工作目录为gh_mirrors/le/lego支持通过多种 DNS Provider 完成 DNS-01 挑战。Hosttech官网https://www.hosttech.eu/是其中被官方收录的 DNS Provider 之一代码Codehosttech引入版本Sincev4.5.0配置来源providers/dns/hosttech/hosttech.toml文档即由该 TOML 自动生成该 Provider 的实现位于 providers/dns/hosttech/hosttech.go内部 API 客户端位于 providers/dns/hosttech/internal/client.go。所有环境变量统一使用HOSTTECH_前缀见源码envNamespace HOSTTECH_。快速开始一条命令签发通配符证书在 shell 中设置好HOSTTECH_API_KEY后即可直接运行 lego 发起签发请求HOSTTECH_API_KEYxxxxxxxxxxxxxxxxxxxxxxxxxx \ lego run --dns hosttech -d *.example.com -d example.com其中--dns hosttech指定使用 Hosttech 作为 DNS-01 挑战的 Provider-d *.example.com请求签发通配符证书必须配合 DNS-01 使用-d example.com同时覆盖裸域保证证书同时包含两个名称。运行后lego 会调用 Hosttech API 在对应 DNS 区域中创建_acme-challenge的 TXT 记录等待其完成全球传播后向 ACME 服务器提交验证验证成功后自动删除该 TXT 记录最后保存证书与私钥。凭据配置环境变量与_FILE后缀核心凭据变量环境变量名说明HOSTTECH_API_KEYAPI 登录凭据API loginHOSTTECH_PASSWORDAPI 密码API password需要说明的是尽管文档中同时列出了HOSTTECH_PASSWORD但从当前仓库源码看NewDNSProvider 实际只通过env.Get(EnvAPIKey)读取并校验HOSTTECH_API_KEY一个变量常量定义见 hosttech.go。缺少该变量时会返回错误hosttech: some credentials information are missing: HOSTTECH_API_KEY因此以当前版本代码为准实际必填项是HOSTTECH_API_KEY。该 Key 会被作为 OAuth 静态访问令牌access token附加到对 Hosttech API 的每次请求头中详见后文“底层原理”。从文件读取凭据_FILE后缀所有环境变量名都可以追加_FILE后缀以“指向一个文件”的方式代替直接写值避免敏感信息出现在命令行或进程环境中。例如HOSTTECH_API_KEY_FILE/path/to/hosttech-api-key \ lego run --dns hosttech -d *.example.com -d example.com文件内容只能包含纯值不含换行与多余字符系统约定请参见 docs/content/dns/_index.md 中的 Configuration and Credentials 一节。使用 dotenv 文件在lego run时可通过--env-file指定 dotenv 文件集中管理变量lego run --dns hosttech --domains example.com --env-file .env.hosttech.env.hosttech示例HOSTTECH_API_KEYxxxxxxxxxxxxxxxxxxxxxxxxxx HOSTTECH_TTL300若以配置文件方式.lego.yml使用也可为 Provider 指定envFile详见 docs/content/dns/_index.md。附加配置参数详解环境变量名说明默认值HOSTTECH_HTTP_TIMEOUTAPI 请求超时时间秒30HOSTTECH_POLLING_INTERVALDNS 传播检查的轮询间隔秒2HOSTTECH_PROPAGATION_TIMEOUT等待 DNS 传播的最大时长秒60HOSTTECH_TTLDNS 挑战所用 TXT 记录的 TTL秒3600这些默认值与 NewDefaultConfig 的实现一一对应TTL默认3600来自env.GetOrDefaultInt(EnvTTL, 3600)PropagationTimeout默认使用dns01.DefaultPropagationTimeout即 60 秒PollingInterval默认使用dns01.DefaultPollingInterval即 2 秒HTTPClient.Timeout默认 30 秒。其中两个默认值直接引用自 challenge/dns01/dns_challenge.go 中定义的常量DefaultPropagationTimeout 60 * time.Second、DefaultPollingInterval 2 * time.Second。也就是说若不显式设置Hosttech Provider 的传播等待策略与 lego 其他 Provider 完全一致。通过 Timeout() 方法lego 在等待 DNS 传播时会使用上面配置的PropagationTimeout与PollingInterval如遇域名传播波动适当调大这两个值可以降低验证失败率。对于权威 DNS 更新较快的场景也可调小HOSTTECH_TTL例如 300以缩短传播等待时间。底层原理凭据校验与 API 调用链Provider 的构建与校验NewDNSProviderConfig 是构造 Provider 的核心入口逻辑如下若传入的config为 nil返回错误hosttech: the configuration of the DNS provider is nil若APIKey为空返回错误hosttech: missing credentials通过internal.NewClient创建 API 客户端并使用internal.OAuthStaticAccessToken(config.HTTPClient, config.APIKey)将 API Key 包装为 OAuth2 静态令牌。对应地hosttech_test.go 的TestNewDNSProvider用例覆盖了“成功”与“缺少 API Key”两种场景可作为集成时的行为参考。认证方式OAuth2 静态令牌internal/client.go 中的OAuthStaticAccessToken使用oauth2.Transport与oauth2.StaticTokenSource将HOSTTECH_API_KEY作为固定 access token 注入到每个 HTTP 请求的Authorization头中。这是 Hosttech API 对客户端请求的认证方式。挑战流程Present 与 CleanUpProvider 实现了challenge.Provider接口核心是Present与CleanUp两个方法Present创建 TXT 记录见 hosttech.go通过dns01.GetChallengeInfo计算出挑战的_acme-challenge记录值与有效 FQDN调用dns01.DefaultClient().FindZoneByFqdn定位权威 DNS 区域auth zone调用client.GetZone获取区域信息APIGET /api/user/v1/zones/{zoneId}通过dns01.ExtractSubDomain从有效 FQDN 中剥离出子域前缀构造internal.Record{Type: TXT, Name: subDomain, Text: info.Value, TTL: config.TTL}并调用client.AddRecordAPIPOST /api/user/v1/zones/{zoneId}/records新增记录将返回的新记录 ID 以token为键暂存到recordIDs映射中带互斥锁保护供后续清理使用。CleanUp删除 TXT 记录见 hosttech.go重新定位区域FindZoneByFqdn GetZone从recordIDs中按 token 取出之前创建的记录 ID调用client.DeleteRecordAPIDELETE /api/user/v1/zones/{zoneId}/records/{recordId}删除记录并同步清理本地映射。值得注意的细节是Present依赖内存中的 token→recordID 映射来完成清理因此同一进程内“创建后清理”是闭环的若进程在 Present 之后被重启残留的 TXT 记录不会自动被清理需要人工在 Hosttech 控制台删除。相关 live 测试TestLivePresent/TestLiveCleanUp见 hosttech_test.go只有在设置了HOSTTECH_API_KEY与测试域名环境变量的真实环境下才会执行验证了完整创建—删除链路。API 客户端细节internal/client.go 中的默认 API 基地址为const defaultBaseURL https://api.ns1.hosttech.eu/api请求统一走user/v1命名空间下的 Zones / Records 接口响应统一包装为apiResponse[T]{data: ...}结构非 2xx 状态码会解析为APIError并拼接状态码、message 与 errors 字段见 internal/types.go。这些实现细节表明只要 Hosttech 账号有访问对应区域的 API 权限lego 即可完成区域定位、记录增删的全部操作无需人工干预。作为 Go 库集成除了 CLI还可以将 Hosttech Provider 作为 Go 库使用源码路径 providers/dns/hosttech/hosttech.go。基本方式import github.com/go-acme/lego/v5/providers/dns/hosttech // 方式一从环境变量 HOSTTECH_API_KEY 读取凭据 provider, err : hosttech.NewDNSProvider() if err ! nil { log.Fatal(err) } // 方式二显式构造配置可编程覆盖超时、TTL 等 config : hosttech.NewDefaultConfig() config.APIKey xxxxxxxxxxxxxxxxxxxxxxxxxx config.TTL 300 config.PropagationTimeout 120 * time.Second provider, err hosttech.NewDNSProviderConfig(config) if err ! nil { log.Fatal(err) }Config结构体hosttech.go包含APIKey、PropagationTimeout、PollingInterval、TTL与HTTPClient五个字段可完全以编程方式覆盖全部环境变量行为。排查与注意事项小结必填凭据当前实现只校验HOSTTECH_API_KEYHOSTTECH_PASSWORD虽在文档中列出但源码未读取无需设置。默认等待策略传播超时 60 秒、轮询间隔 2 秒、HTTP 超时 30 秒、TXT TTL 3600 秒均可在不修改代码的情况下通过环境变量调整。传播较慢的域名适当调大HOSTTECH_PROPAGATION_TIMEOUT并调小HOSTTECH_TTL可显著降低“传播未完成导致验证失败”的概率。通配符证书必须使用 DNS-01 挑战--dns hosttech因为通配符域名无法通过 HTTP-01 验证。记录清理边界CleanUp依赖进程内记录的 record ID进程异常退出后需手动清理残留 TXT 记录。本文所有配置项、默认值及源码行为均以当前仓库实现为准读者可直接对照 providers/dns/hosttech/hosttech.toml、hosttech.go 与 hosttech_test.go 进行核验。赞分享网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载相关推荐使用 lego 的 Dynadot DNS 提供商通过 DNS-01 挑战签发 ACME 证书使用 lego 的 Dynadot DNS 提供商通过 DNS 01 挑战签发 ACME 证书 导读 本文介绍 go acme/legoLets Encry网络安全密码学Finnish Humanizer 实战指南用 awesome-copilot 技能识别并消除芬兰语文本中的 26 种 AI 痕迹Finnish Humanizer 实战指南用 awesome copilot 技能识别并消除芬兰语文本中的 26 种 AI 痕迹 导读 本文围绕 aweso网络安全密码学使用 lego 通过 Constellix DNS 提供商签发 ACME 证书DNS-01 挑战完整配置指南使用 lego 通过 Constellix DNS 提供商签发 ACME 证书DNS 01 挑战完整配置指南 本文以 legoLets Encrypt/A网络安全密码学上一篇Vue Storefront多店铺部署配置指南下一篇深入Pkl语言特性类型系统与验证机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
