ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

使用 lego 通过 Amazon Lightsail DNS 完成 DNS-01 证书签发挑战

使用 lego 通过 Amazon Lightsail DNS 完成 DNS-01 证书签发挑战 网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载本文以 lego 项目中 Amazon Lightsail DNS 提供者的官方文档为主体结合其 lightsail.go 源码与测试讲解如何为 ACME 证书签发配置 AWS Lightsail DNS 作为 DNS-01 挑战的求解器。你将掌握所需的全部环境变量与 IAM 权限策略、AWS 凭证自动发现顺序、超时调优参数以及 lego 底层如何调用 Lightsail API 写入和删除 TXT 记录。概述lego 的 Lightsail DNS 提供者Amazon Lightsail 是 AWS 提供的轻量级云服务同时也内置了托管的 DNS 区域DNS zone功能。lego 作为一个用 Go 编写的 Lets Encrypt/ACME 客户端与库为 Lightsail 提供了官方的 DNS 提供者用于解决DNS-01 挑战。该提供者的基本身份信息来自 zz_gen_lightsail.md 与 lightsail.toml项目值Provider Codelightsail引入版本v0.5.0官方链接https://aws.amazon.com/lightsail/底层 AWS SDKgithub.com/aws/aws-sdk-go-v2在 lego 中所有 DNS 提供者都通过统一的--dns命令行参数选择对应NewDNSProvider工厂函数在 zz_gen_dns_providers.go 中的注册因此使用 Lightsail 的典型命令为lego --email youexample.com --dns lightsail --domains example.com run需要注意的是Lightsail 的 DNS 区域位于全局us-east-1区域因此无需额外指定 AWS 区域但通过LIGHTSAIL_REGION环境变量可以覆盖这一默认值详见下文源码分析。凭证配置环境变量与 AWS 凭证发现机制必需环境变量根据文档配置 Lightsail DNS 提供者需要以下环境变量环境变量名说明AWS_ACCESS_KEY_ID由 AWS 客户端管理。Access key ID注意不支持AWS_ACCESS_KEY_ID_FILE请改用AWS_SHARED_CREDENTIALS_FILEAWS_SECRET_ACCESS_KEY由 AWS 客户端管理。Secret access key同样不支持AWS_SECRET_ACCESS_KEY_FILE请改用AWS_SHARED_CREDENTIALS_FILEDNS_ZONEDNS 区域的域名Domain name of the DNS zone其中DNS_ZONE是 lego 自身需要读取的变量它指定了要在哪个 Lightsail DNS 区域中写入挑战记录。可选附加配置环境变量名说明AWS_SHARED_CREDENTIALS_FILE由 AWS 客户端管理。共享凭证文件路径LIGHTSAIL_POLLING_INTERVALDNS 传播检查间隔秒默认值 2LIGHTSAIL_PROPAGATION_TIMEOUTDNS 传播最大等待时间秒默认值 120_FILE后缀约定与 lego 中其他 DNS 提供者一致所有环境变量都可以通过在变量名后追加_FILE后缀来改为引用一个文件路径详见 docs/content/dns/_index.md 的“_FILEsuffix”一节。当XXX_FILE存在时lego 会从该文件读取值且文件内容必须只包含该值本身。不过由于AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_SHARED_CREDENTIALS_FILE是由 AWS 客户端直接管理的针对前两者的_FILE变体不被支持若想避免在环境变量中直接暴露密钥应使用 AWS 官方的共享凭证文件~/.aws/credentials通过AWS_PROFILE指定 profile。从源码层面看lightsail.go 的NewDNSProvider通过env.GetOrFile(EnvDNSZone)读取DNS_ZONE支持_FILE变体而LIGHTSAIL_POLLING_INTERVAL和LIGHTSAIL_PROPAGATION_TIMEOUT则通过env.GetOrDefaultSecond读取其实现逻辑是优先取环境变量值若解析失败则回退到默认值env.go。AWS 凭证的自动发现顺序lego 的 Lightsail 提供者遵循 AWS SDK 的标准凭证链凭证会自动按以下优先级被发现文档与 lightsail.go 注释一致环境变量AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN共享凭证文件默认路径~/.aws/credentials可通过AWS_PROFILE指定 profileAmazon EC2 IAM 角色当 lego 运行在 EC2 实例上时自动从实例元数据服务获取临时凭证这一行为也在 lightsail_test.go 的TestCredentialsFromEnv测试中得到验证设置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY与AWS_REGION后AWS 配置能直接从环境变量中检索到凭证凭证来源标记为EnvConfigCredentials。IAM 权限策略最小权限配置Lightsail DNS 挑战的完成需要创建和删除 DNS 记录。文档给出了lego 完成 DNS 挑战所需的最小 IAM 权限策略{ Version: 2012-10-17, Statement: [ { Effect: Allow, Action: [ lightsail:DeleteDomainEntry, lightsail:CreateDomainEntry ], Resource: Lightsail DNS zone ARN } ] }关键使用要点将Resource替换为你的 Lightsail DNS 区域 ARN。获取 ARN 的方式由于Lightsail Web 控制台不显示 ARN需要通过 AWS CLI 获取aws lightsail get-domains --region us-east-1ARN 的格式为arn:aws:lightsail:global:ACCOUNT ID:Domain/DOMAIN ID。注意其中区域部分写作global你需要将其替换为us-east-1才能作为有效的Resource值。也可以将Resource设为通配符*允许访问所有域名但不推荐这样做应遵循最小权限原则。这两个 API 动作与源码中的实现一一对应Present调用CreateDomainEntrylightsail.goCleanUp调用DeleteDomainEntrylightsail.go。工作原理lego 如何通过 Lightsail API 完成挑战Present写入挑战 TXT 记录当 ACME 服务器要求完成 DNS-01 挑战时lego 会调用提供者的Present方法lightsail.go。其内部流程为通过dns01.GetChallengeInfo基于域名与 keyAuth 计算出挑战所需的Effective FQDN形如_acme-challenge.example.com与 TXT 记录值构造CreateDomainEntryInput其中DomainName取配置中的DNS_ZONEDomainEntry.Name为 Effective FQDNDomainEntry.Type固定为TXTDomainEntry.Target为挑战值并使用strconv.Quote加引号符合 TXT 记录的规范格式调用 Lightsail 客户端的CreateDomainEntryAPI 创建记录。CleanUp删除挑战 TXT 记录挑战验证完成后或失败清理时lego 调用CleanUp删除临时 TXT 记录lightsail.go。它构造DeleteDomainEntryInput使用与写入时完全相同的Name、Type、Target三元组来精确匹配并删除记录避免误删其他 TXT 条目。Timeout控制传播等待DNSProvider实现了challenge.ProviderTimeout接口lightsail.go其Timeout()方法返回配置的传播超时与轮询间隔lightsail.go。在 dns_challenge.go 的Solve流程中lego 会根据该接口返回值决定等待策略若提供者实现了ProviderTimeout采用其自定义的timeout/interval否则回退到 dns01 包的默认值DefaultPropagationTimeout 60s、DefaultPollingInterval 2s见 dns_challenge.go。对于 Lightsail 提供者默认配置即来自这两个常量lightsail.go因此文档中的“默认 120 秒超时 / 2 秒轮询”与实际默认值60s/2s可能存在差异——如果你的环境传播较慢建议显式设置LIGHTSAIL_PROPAGATION_TIMEOUT以留出充足余量。底层客户端与重试策略NewDNSProviderConfiglightsail.go使用 AWS SDK v2 的config.LoadDefaultConfig构造客户端并做了两件值得注意的事通过awsconfig.WithRegion(config.Region)设置区域NewDNSProvider中Region默认为us-east-1可通过LIGHTSAIL_REGION环境变量覆盖lightsail.go配置了自定义重试器最大重试次数maxRetries 5并采用带随机抖动的指数退避算法——初始延迟约 400ms、上限约 30 秒以应对 API 限流lightsail.go。实战配置示例结合文档与 lego 的通用配置方式一个完整的端到端配置如下# 方式一全部通过环境变量CLI 场景 AWS_ACCESS_KEY_IDAKIA... \ AWS_SECRET_ACCESS_KEY... \ DNS_ZONEexample.com \ lego --email youexample.com --dns lightsail --domains example.com --domains *.example.com run# 方式二通过 --env-file 加载 dotenv 文件 lego run --dns lightsail --domains example.com --env-file .env.lightsail对应的.env.lightsail文件内容AWS_ACCESS_KEY_IDAKIA... AWS_SECRET_ACCESS_KEY... DNS_ZONEexample.com LIGHTSAIL_POLLING_INTERVAL2 LIGHTSAIL_PROPAGATION_TIMEOUT120在库library场景下也可以在配置文件中通过envFile指定 dotenv 文件详见 docs/content/dns/_index.md 的示例。集成测试与验证仓库中的 lightsail_integration_test.go 展示了完整的使用闭环TestLiveTTL它通过NewDNSProvider()创建提供者调用Present写入_acme-challenge.domain的 TXT 记录随后使用独立的 Lightsail 客户端因为提供者内部的 client 未导出通过GetDomainAPI 验证记录确实存在最后在 defer 中调用CleanUp清理。这从侧面印证了文档所述流程的可运行性也提醒开发者Present与CleanUp必须成对调用避免留下残留的挑战记录。更多信息底层 Go 客户端github.com/aws/aws-sdk-go-v2Lightsail 服务包为service/lightsail提供者源码lightsail.go提供者测试lightsail_test.go、lightsail_integration_test.go配置定义lightsail.toml通用 DNS 配置说明docs/content/dns/_index.md赞分享网络安全密码学【免费下载链接】legoLets Encrypt/ACME client and library written in Go项目地址https://gitcode.com/gh_mirrors/le/lego点击查看免费下载相关推荐使用 lego 通过 Hosttech DNS Provider 完成 DNS-01 挑战并签发 ACME 证书使用 lego 通过 Hosttech DNS Provider 完成 DNS 01 挑战并签发 ACME 证书 本文以 legoLets Encrypt/网络安全密码学使用 lego 的 Dynadot DNS 提供商通过 DNS-01 挑战签发 ACME 证书使用 lego 的 Dynadot DNS 提供商通过 DNS 01 挑战签发 ACME 证书 导读 本文介绍 go acme/legoLets Encry网络安全密码学10个Grapple.nvim实用快捷键让文件导航效率提升300%10个Grapple.nvim实用快捷键让文件导航效率提升300% Grapple.nvim是一款专为Neovim设计的文件标签管理插件通过简单的命令和快捷网络安全密码学创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表