
网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载lego 是使用 Go 编写的 Lets Encrypt/ACME 客户端与库支持通过 DNS 提供商完成 DNS-01 挑战。本文围绕官方文档 docs/content/dns/zz_gen_limacity.md 讲解其中 Lima-City 提供商的完整配置方式凭证、超时、轮询、TTL 等环境变量并结合 providers/dns/limacity 下的源码与测试说明其底层实现原理API 调用链、域名查找、TXT 记录增删与传播等待帮助读者用一条命令签发通配符证书也能深入理解该提供商的工作机制。适用前提本文所有命令与参数均以当前仓库lego 源码模块路径github.com/go-acme/lego/v5为准。Lima-City 提供商自 lego v4.18.0 起可用你需要一个 Lima-City 账户德国主机与域名服务商及其提供的 API Key。一、Lima-City 提供商概览Lima-City 是 lego 内置的 DNS 提供商之一用于在 DNS 服务托管于 Lima-City 时自动完成 ACME DNS-01 挑战。其基本标识信息在自动生成的文档 limacity.toml 中有明确定义名称Lima-City代码--dns参数值limacity自版本v4.18.0官方 API 文档Lima-City 提供的 API 说明页在 lego 中该提供商的包位于 providers/dns/limacity包注释明确指出其用途implements a DNS provider for solving the DNS-01 challenge using Lima-City DNS见 limacity.go。二、最小可用的 CLI 配置示例官方文档给出的最小示例是一条 bash 命令设置 API Key 环境变量后用--dns limacity运行lego run并同时申请通配符域名与裸域名LIMACITY_API_KEYxxxxxxxxxxxxxxxxxxxxx \ lego run --dns limacity -d *.example.com -d example.com要点说明--dns limacity指定使用 Lima-City 提供商-d *.example.com与-d example.com同时申请通配符证书与裸域名裸域名证书通常与通配符证书一起签发便于example.com与www.example.com共用同一张证书每个域名都会生成对应的_acme-challenge.domainTXT 记录并等待其全球传播。三、凭证配置Credentials文档中 Lima-City 提供商只需要一个凭证环境变量环境变量名说明LIMACITY_API_KEYLima-City API Key该变量在源码中定义于 limacity.go前缀LIMACITY_是环境变量命名空间const ( envNamespace LIMACITY_ EnvAPIKey envNamespace API_KEY )NewDNSProvider()在构造时通过env.Get(EnvAPIKey)读取该变量若缺失会返回错误limacity: some credentials information are missing: LIMACITY_API_KEY见 limacity.go并由 limacity_test.go 的TestNewDNSProvider用例验证。也就是说未设置LIMACITY_API_KEY时lego 会直接报错而不会开始挑战。_FILE后缀把凭证放入文件所有环境变量名都可以加_FILE后缀改为引用一个文件路径文件内容即为该变量的值。例如LIMACITY_API_KEY_FILE/path/to/my/limacity-key \ lego run --dns limacity -d example.com其中/path/to/my/limacity-key文件内容只需包含 API Key 本身结尾换行会被自动去除。该机制由platform/env包中的GetOrFile实现先读key为空再读key_FILE指向的文件内容并用strings.TrimRight(..., \r\n)去掉末尾换行见 platform/env/env.go。这种方式的典型用途是把密钥放入仅属主可读的文件或 secrets 挂载中避免密钥出现在 shell 历史、进程环境或 CI 日志里。其他传参方式dotenv 文件与配置文件除了 shell 环境变量lego 还支持两种批量传参方式dotenv 文件lego run可用--env-file指定一个.env文件lego run --dns limacity --domains example.com --env-file .env.limacity.env.limacity内容形如LIMACITY_API_KEYyourlimacityapikeylego 配置文件.lego.yml直接运行lego时使用可在 DNS challenge 配置中指定envFilechallenges: limacity: dns: provider: limacity envFile: .env.limacity certificates: foo: domains: - example.com以上通用机制详见 docs/content/dns/_index.md 的 Configuration and Credentials 一节。四、附加配置项Additional Configuration文档列出的全部可选环境变量如下环境变量名说明默认值LIMACITY_HTTP_TIMEOUTAPI 请求超时秒30LIMACITY_POLLING_INTERVALDNS 传播检查的轮询间隔秒80LIMACITY_PROPAGATION_TIMEOUT等待 DNS 传播的最大时间秒480LIMACITY_SEQUENCE_INTERVAL顺序执行请求之间的间隔秒90LIMACITY_TTL用于 DNS 挑战的 TXT 记录 TTL秒60同样地这些变量也支持_FILE后缀。这些默认值在源码 limacity.go 的NewDefaultConfig中实现func NewDefaultConfig() *Config { return Config{ TTL: env.GetOrDefaultInt(EnvTTL, 60), PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, 8*time.Minute), PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, 80*time.Second), SequenceInterval: env.GetOrDefaultSecond(EnvSequenceInterval, 90*time.Second), HTTPClient: http.Client{ Timeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second), }, } }各项参数的语义与影响LIMACITY_TTL默认 60 秒新建 TXT 记录的 TTL。DNS-01 挑战中 TXT 记录由 ACME 服务器发起查询验证TTL 过小可能影响传播稳定过大则会拖慢解析收敛对 Lima-City 的默认值 60 秒在大多数情况下是合理选择。LIMACITY_PROPAGATION_TIMEOUT默认 480 秒 8 分钟lego 在 TXT 记录写入后最多等待这么久来确认记录已在权威 DNS 可见。DNSProvider实现了challenge.ProviderTimeout接口Timeout()返回(PropagationTimeout, PollingInterval)见 limacity.go。传播时间出现尖峰时可通过调大该值来降低失败率。LIMACITY_POLLING_INTERVAL默认 80 秒传播检查的轮询间隔。lego 会在该间隔后开始轮询并在超时时间内反复查询直到记录可见见 challenge/dns01/dns_challenge.go 的wait.For(timeout, interval, ...)调用。LIMACITY_SEQUENCE_INTERVAL默认 90 秒该提供商的所有 DNS 挑战按顺序执行此值表示两次顺序请求之间的间隔。DNSProvider实现了Sequential()方法返回该间隔见 limacity.godns01.Challenge.Sequential()会检测实现了sequential接口的提供商并据此决定执行节奏见 challenge/dns01/dns_challenge.go。这对同时申请多个域名尤其是通配符 裸域名的场景有实际影响多个 TXT 记录会逐个写入避免同时对 Lima-City API 发起突发请求。LIMACITY_HTTP_TIMEOUT默认 30 秒单次对 Lima-City API 请求的 HTTP 超时作用于http.Client.Timeout。使用示例调整参数LIMACITY_API_KEYxxxxxxxxxxxxxxxxxxxxx \ LIMACITY_TTL120 \ LIMACITY_POLLING_INTERVAL60 \ LIMACITY_PROPAGATION_TIMEOUT600 \ LIMACITY_SEQUENCE_INTERVAL120 \ LIMACITY_HTTP_TIMEOUT45 \ lego run --dns limacity -d *.example.com -d example.com五、底层实现原理结合源码1. API 端点与认证方式内部客户端定义在 providers/dns/limacity/internal/client.go默认基础地址为https://www.lima-city.de/usercp所有请求都通过 HTTP Basic Auth 认证用户名固定为api、密码为 API Key见 client.go 的req.SetBasicAuth(api, c.apiKey)。实际使用的端点基于源码与测试用例 client_test.go方法端点用途GET/domains.json拉取账户下全部域名列表GET/domains/{domainId}/records.json拉取某域名的记录列表POST/domains/{domainId}/records.json新增记录PUT/domains/{domainId}/records/{recordId}更新记录DELETE/domains/{domainId}/records/{recordId}删除记录所有请求带Accept: application/json带负载的请求额外带Content-Type: application/json响应结构见 internal/types.goDomainsResponse、RecordsResponse、NameserverRecordPayload、APIResponse。APIResponse.Error()会把status与errors详情拼成错误信息例如测试中断言的[status code: 400] status: invalid_resource, details: name: [muss ausgefüllt werden]。2. 写入 TXT 记录PresentPresent()limacity.go的执行链为由dns01.GetChallengeInfo(ctx, domain, keyAuth)计算出挑战记录的目标 FQDN_acme-challenge.domain.与 TXT 值。TXT 值是对 Key Authorization 做 SHA-256 后按 base64 URL 无填充编码得到的见 challenge/dns01/dns_challenge.go调用GetDomains获取域名列表findDomain从dns01.DomainsSeq(fqdn)生成的逐级 FQDN 序列如_acme-challenge.example.com→example.com→com中匹配用户账户里的域名找到UnicodeFqdn对应的域名及 ID见 limacity.go。该序列机制使 lego 能正确处理裸域名、子域名与通配符场景用dns01.ExtractSubDomain从完整 FQDN 中剥离出子域标签组装internal.Record{Name: subDomain, Content: value, TTL: config.TTL, Type: TXT}调用AddRecord写入把token - domainID记录到内部 map加锁保护供后续 CleanUp 使用。测试用例 client_test.go 验证了 POST 请求体形如{nameserver_record:{name:foo,content:bar,ttl:12,type:TXT}}与上述字段一致。3. 等待传播与校验写入记录后dns01.Challenge.Solve使用Timeout()提供的超时与间隔调用wait.For轮询权威解析结果直到 TXT 值可见再向 ACME 服务器提交验证见 challenge/dns01/dns_challenge.go。这也是上文LIMACITY_POLLING_INTERVAL与LIMACITY_PROPAGATION_TIMEOUT生效的位置。4. 清理 TXT 记录CleanUpCleanUp()limacity.go执行链为从domainIDsmap 中按 token 取出此前记录的 domain ID不存在则报错unknown domain IDGetRecords拉取该域名的记录列表遍历找出Type TXT且内容等于strconv.Quote(info.Value)即带引号的 TXT 值的记录 ID——注意测试夹具中 TXT 内容是以引号包裹形式存储的见 internal/fixtures/get-records.json 中content: \foobar\DeleteRecord删除该记录找不到时报TXT record not found从 map 中删除 token 条目。5. 并发与错误处理domainIDsmap 由sync.Mutex保护避免多域名并发挑战时读写冲突所有对外错误统一包装为limacity: ...前缀如limacity: get domains: ...、limacity: add record: ...便于在日志中快速定位NewDNSProviderConfig对config nil与空 API Key 均显式报错limacity.go并支持以编程方式注入自定义HTTPClient可用于调试代理或自定义超时。六、以库的方式使用Go 代码除 CLI 外lego 的库模式也可以直接使用该提供商。以编程方式构造时可先创建默认配置再覆盖字段import ( github.com/go-acme/lego/v5/providers/dns/limacity ) func main() { config : limacity.NewDefaultConfig() config.APIKey yourlimacityapikey config.TTL 120 provider, err : limacity.NewDNSProviderConfig(config) if err ! nil { panic(err) } // provider 可用于 lego 客户端的 challenge 配置 // 例如 client.Challenge.SetDNS01Provider(provider) }或者在环境变量已设置时直接用provider, err : limacity.NewDNSProvider()两种构造函数都有对应的单元测试覆盖limacity_test.go包括缺少 API Key的错误分支测试还包含TestLivePresent/TestLiveCleanUp两个真实环境测试默认在无LIMACITY_DOMAIN等环境时跳过可用于对真实账户做端到端验证。七、常见问题与注意事项some credentials information are missing: LIMACITY_API_KEY未设置LIMACITY_API_KEY或其_FILE变体所致先检查环境变量是否在当前 shell 中可见lego run前的export或行内赋值。通配符证书必须走 DNS-01HTTP-01/TLS-ALPN-01 无法验证*.example.com因此 Lima-City 这类 DNS 提供商是签发通配符证书的必经路径。等待时间较长属正常现象默认轮询间隔 80 秒、传播超时 480 秒。若频繁在传播阶段失败可适当调大LIMACITY_PROPAGATION_TIMEOUT若需要更快的失败反馈可调小LIMACITY_POLLING_INTERVAL注意不要给 Lima-City API 造成过大压力。多域名/通配符会顺序执行因为实现了Sequential()多个挑战会串行并以LIMACITY_SEQUENCE_INTERVAL为间隔避免瞬时并发写记录导致限流。记录清理挑战完成或失败后 lego 会调用CleanUp删除 TXT 记录。若手动在 Lima-City 控制台看到残留的_acme-challengeTXT 记录通常是清理阶段网络异常可手动删除。配置文件方式通过.lego.yml使用 Lima-City 时需在challenges.name.dns.provider中写limacity并可通过envFile指向 dotenv 文件见上文示例。八、进一步阅读提供商元数据与自动生成文档源providers/dns/limacity/limacity.toml提供商核心实现providers/dns/limacity/limacity.goAPI 客户端实现providers/dns/limacity/internal/client.go响应数据结构providers/dns/limacity/internal/types.go单元测试与 API 夹具providers/dns/limacity/limacity_test.go、providers/dns/limacity/internal/client_test.goDNS-01 挑战通用机制docs/content/obtain/dns01.md 与 challenge/dns01/dns_challenge.go全部 DNS 提供商的凭证与环境变量通用约定docs/content/dns/_index.md赞分享网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载相关推荐lego 使用 deSEC.io DNS Provider 完成 DNS-01 挑战配置指南与实现原理lego 使用 deSEC.io DNS Provider 完成 DNS 01 挑战配置指南与实现原理 导读 deSEC.io 是一个免费开源的 DNS 托管网络安全密码学使用 lego 通过 Liara DNS 完成 DNS-01 挑战配置、凭据与实现原理使用 lego 通过 Liara DNS 完成 DNS 01 挑战配置、凭据与实现原理 导读 本文面向使用 lego https://link.gitcode网络安全密码学Qwen3-Coder 仓库中的 DevQualityEval v0.5.0 单模型报告解读yi-6b 的测试生成评测、七级分类与评分构成Qwen3 Coder 仓库中的 DevQualityEval v0.5.0 单模型报告解读yi 6b 的测试生成评测、七级分类与评分构成 本文以 Qwen3网络安全密码学创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考