资讯动态

使用 lego 通过百度云(Baidu Cloud)DNS 完成 ACME DNS-01 挑战:配置指南与源码实现解析

发布时间:2026/9/24 16:32:31 来源:尧图企业网站定制
网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载导读本文以 lego 官方文档中 Baidu Cloud DNS 提供者页面docs/content/dns/zz_gen_baiducloud.md为主体系统讲解如何在 lego CLI 中使用百度云公网 DNS 服务解决 ACME DNS-01 挑战实现通配符wildcard证书的自动签发。你将掌握完整的环境变量配置方法、_FILE文件注入与 dotenv 用法、TTL 与传播等待参数调优以及从凭据加载、TXT 记录创建到清理的完整源码调用链让证书签发流程既可用又可审计。Baidu Cloud 提供者概览Baidu Cloud DNS 提供者允许 lego 通过百度云官方 Go SDKgithub.com/baidubce/bce-sdk-go调用百度云 DNS API在 DNS-01 挑战期间自动创建并清理 TXT 记录无需人工干预。该提供者的元数据定义在 providers/dns/baiducloud/baiducloud.toml 中关键标识如下属性值提供者 Code--dns参数值baiducloud官方文档链接https://cloud.baidu.com百度云 DNS API 文档引入版本v4.23.0底层 SDKgithub.com/baidubce/bce-sdk-go的services/dns包从源码结构看提供者整体遵循 lego 的challenge.Provider接口约定Present负责创建挑战 TXT 记录CleanUp负责在验证完成后删除记录Timeout负责声明 DNS 传播等待策略baiducloud.go 中的DNSProvider同时实现了challenge.ProviderTimeout接口。前置条件使用百度云 DNS 提供者前需要准备百度云账号并开通公网 DNS 服务API 访问凭据Access Key ID 与 Secret Access Key可在百度云控制台的安全认证中创建域名解析目标域名必须已在百度云 DNS 中添加托管区域Zonelego 可执行文件版本不低于 v4.23.0该提供者自该版本引入。快速开始命令行签发通配符证书官方文档给出了最直接的使用方式——通过环境变量注入凭据然后执行lego runBAIDUCLOUD_ACCESS_KEY_IDxxx \ BAIDUCLOUD_SECRET_ACCESS_KEYyyy \ lego run --dns baiducloud -d *.example.com -d example.com命令说明--dns baiducloud指定使用百度云 DNS 提供者-d *.example.com -d example.com同时为通配符域名和裸域名申请证书。注意 ACME 规定通配符证书只能通过 DNS-01 挑战签发因此这也是最常见的组合首次运行且未注册账号时lego 会引导完成 ACME 账号注册也可通过lego --email youexample.com run ...显式指定邮箱。该提供者在 CLI 层由 providers/dns/zz_gen_dns_providers.go 注册当--dns baiducloud时调用baiducloud.NewDNSProvider()。凭据配置详解核心凭据环境变量环境变量名说明BAIDUCLOUD_ACCESS_KEY_ID百度云 Access Key访问密钥 IDBAIDUCLOUD_SECRET_ACCESS_KEY百度云 Secret Access Key访问密钥这两个变量由源码中的常量定义baiducloud.goenvNamespace BAIDUCLOUD_ EnvAccessKeyID envNamespace ACCESS_KEY_ID EnvSecretAccessKey envNamespace SECRET_ACCESS_KEYNewDNSProvider()会通过env.Get(EnvAccessKeyID, EnvSecretAccessKey)同时校验两个变量是否存在缺一即报错baiducloud.go。这一行为在 baiducloud_test.go 中有完整覆盖缺少 Secret Access Key 时返回some credentials information are missing: BAIDUCLOUD_SECRET_ACCESS_KEY缺少 Access Key ID 时同理两者皆缺时错误信息会同时列出两个变量名。_FILE后缀从文件读取凭据所有环境变量含凭据与附加配置都可以通过追加_FILE后缀改为从文件读取适合密钥落盘、避免密钥暴露在命令行/进程环境变量的场景。例如BAIDUCLOUD_ACCESS_KEY_ID_FILE/path/to/access_key_id \ BAIDUCLOUD_SECRET_ACCESS_KEY_FILE/path/to/secret_access_key \ lego run --dns baiducloud -d *.example.com -d example.com对应的两个文件中各只包含一行纯文本值不能有多余换行之外的内容。该机制实现在 platform/env/env.go 的GetOrFile中先读环境变量原值为空时再尝试读取key_FILE指向的文件文件内容会被去除末尾的\r\n读取失败会记录告警日志并返回空值。更完整的用法说明见 docs/content/dns/_index.md。使用 dotenv 文件除直接设置环境变量外lego 支持通过 dotenv 文件集中管理凭据lego run --dns baiducloud -d *.example.com -d example.com --env-file .env.baidu.env.baidu内容示例BAIDUCLOUD_ACCESS_KEY_IDxxx BAIDUCLOUD_SECRET_ACCESS_KEYyyy在库library模式下还可以在 lego 配置文件.lego.yml中为提供者指定envFilechallenges: baiducloud: dns: provider: baiducloud envFile: .env.baidu certificates: example: domains: - example.com - *.example.com附加配置参数除凭据外提供者还支持三个附加调优参数环境变量名说明默认值BAIDUCLOUD_POLLING_INTERVALDNS 传播检查的时间间隔秒2BAIDUCLOUD_PROPAGATION_TIMEOUTDNS 传播的最大等待时间秒60BAIDUCLOUD_TTL挑战 TXT 记录使用的 TTL秒300这些参数在 baiducloud.go 的NewDefaultConfig()中加载TTL: env.GetOrDefaultInt(EnvTTL, defaultTTL), // defaultTTL 300 PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, dns01.DefaultPropagationTimeout), // 60s PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval), // 2s三点重要说明TTL 最小值为 300源码注释明确写到300 is the minimum TTL for free usersbaiducloud.go。如果通过NewDNSProviderConfig以编程方式传入更小的 TTL百度云免费用户可能无法生效CLI 模式下即使设置了更小值也会被百度云侧限制。官方建议保持默认 300。传播超时与轮询间隔默认值与 lego 的全局默认一致定义在 challenge/dns01/dns_challenge.goDefaultPropagationTimeout 60s、DefaultPollingInterval 2s。DNSProvider.Timeout()会原样返回这两个配置值baiducloud.go供挑战管理器在创建 TXT 记录后按此节奏轮询解析是否生效。若你的权威 DNS 生效较慢可适当增大BAIDUCLOUD_PROPAGATION_TIMEOUT如 120。数值解析容错GetOrDefaultInt/GetOrDefaultSecond在变量缺失或解析失败时都会静默回退到默认值platform/env/env.go因此配置错误不会中断程序但可能导致超时判断不符合预期排查时需留意。源码实现解析一次挑战的生命周期理解内部实现有助于排查问题和评估扩展点。核心逻辑全部位于 providers/dns/baiducloud/baiducloud.go1. 凭据加载与客户端构建NewDNSProvider()从环境变量读取凭据并构建默认配置NewDNSProviderConfig(config)校验配置非空、凭据非空然后调用baidudns.NewClient(config.AccessKeyID, config.SecretAccessKey, )创建百度云 DNS SDK 客户端baiducloud.go。测试用例TestNewDNSProviderConfigbaiducloud_test.go分别验证了两者皆缺credentials missing、缺 AccessKeyIDaccessKeyId should not be empty、缺 SecretKeysecretKey should not be empty三种失败分支。2. Present创建 TXT 记录Present的执行流程baiducloud.go通过dns01.GetChallengeInfo计算挑战所需的完整 FQDN 与 TXT 值调用dns01.DefaultClient().FindZoneByFqdn根据 FQDN 向上推导出权威 Zone通过dns01.ExtractSubDomain从 FQDN 中剥离 Zone 得到子域前缀_acme-challenge前缀部分构造baidudns.CreateRecordRequest以Type: TXT、Value: info.Value、Ttl: config.TTL调用CreateRecordDescription标记为lego便于在百度云控制台识别。3. CleanUp删除 TXT 记录验证完成后CleanUpbaiducloud.go需要先找到刚创建的记录findRecordID遍历 Zone 下的 TXT 记录通过匹配record.Type TXT record.Value tokenValue定位记录 ID然后调用DeleteRecord删除。由于百度云ListRecord接口支持分页findRecordID会利用IsTruncated与NextMarker持续翻页直到找到记录或全部遍历完毕baiducloud.go找不到时返回record not found错误。4. 测试验证仓库提供了单元测试与实况live测试两层保障baiducloud_test.goTestNewDNSProvider/TestNewDNSProviderConfig验证各种凭据缺失组合下的错误信息不依赖网络TestLivePresent/TestLiveCleanUp在设置了BAIDUCLOUD_*真实凭据且BAIDUCLOUD_DOMAIN指向真实托管域时才会跳过t.Skip执行真实 API 调用以123d为测试 TXT 值完成 Present/CleanUp 闭环。常见问题与排错建议现象可能原因与处理some credentials information are missing: BAIDUCLOUD_*凭据环境变量未设置或_FILE指向的文件为空/读取失败。检查变量名拼写、文件权限及文件内容是否仅含单行值baiducloud: create record: ...Access Key 无 DNS 写权限、Zone 名称解析错误或域名未托管在百度云。请先在控制台确认目标域名的解析 Zone 存在长时间等待后挑战失败DNS 传播超时默认 60s不足以覆盖实际生效时间调大BAIDUCLOUD_PROPAGATION_TIMEOUTTTL 设置不生效免费用户最小 TTL 为 300低于该值的配置会被服务端限制库模式初始化报credentials missing直接调用NewDNSProviderConfig时传入了空的AccessKeyID或SecretAccessKey小结Baidu Cloud DNS 提供者是 lego 生态中接入百度云解析的标准方案通过baiducloud代码、两组凭据环境变量和三个可调参数即可完成配置_FILE后缀与 dotenv 文件让密钥管理更安全。其Present/CleanUp/Timeout的实现严格遵循 lego 的 DNS 提供者接口约定测试覆盖完整适合作为理解 lego DNS 提供者工作原理的参考实现。若需在库模式下以编程方式使用可参考NewDNSProviderConfig的Config结构baiducloud.go直接构造提供者实例。赞分享网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载相关推荐使用 lego 通过 Fornex DNS Provider 完成 DNS-01 挑战配置指南与源码解析使用 lego 通过 Fornex DNS Provider 完成 DNS 01 挑战配置指南与源码解析 本指南以 legoGo 编写的 Lets Enc网络安全密码学深入解析 Open Notebook 的工程化发布流程从风险分级测试矩阵到 Docker 镜像门禁与 Agent 编排深入解析 Open Notebook 的工程化发布流程从风险分级测试矩阵到 Docker 镜像门禁与 Agent 编排 Open NotebookNoteb网络安全密码学MaaAssistantArknights Linux 编译教程从依赖构建到多语言 SDK 集成MaaAssistantArknights Linux 编译教程从依赖构建到多语言 SDK 集成 本教程面向具备一定 Linux 环境配置能力与编程基础的开发网络安全密码学上一篇使用parcel/watcher提升文件系统监控效率下一篇Hash-Buster安全指南合法使用场景与风险防范创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价