折腾Let's Encrypt通配符域名证书
本文最后更新于:2025年8月11日 下午
真是太拖延了,我要改变一下
使用 Let’s Encrypt 已经好几年了,然而早在几年前它就支持通过 DNS 验证获取泛域名证书了,我居然愣是使用定时脚本逐个给域名单独申请证书凑和了好几年。
如今用的域名越来越多,终于打算搞一搞其他用法了
1 验证机制
首先我们要先了解 Let’s Encrypt 的认证机制,详细阅读官方的 Let’s Encrypt 的验证方式1
以下为官方内容节选:
HTTP-01 验证
HTTP-01 验证
这是当今最常见的验证方式。 Let’s Encrypt 向您的 ACME 客户端提供一个令牌,然后您的 ACME 客户端将在您对 Web 服务器的
http://<你的域名>/.well-known/acme-challenge/<TOKEN>
(用提供的令牌替换<TOKEN>
)路径上放置指定文件。 该文件包含令牌以及帐户密钥的指纹。 一旦您的 ACME 客户端告诉 Let’s Encrypt 文件已准备就绪,Let’s Encrypt 会尝试获取它(可能从多个地点进行多次尝试)。 如果我们的验证机制在您的 Web 服务器上找到了放置于正确地点的正确文件,则该验证被视为成功,您可以继续申请颁发证书。 如果验证检查失败,您将不得不再次使用新证书重新申请。我们的 HTTP-01 验证最多接受 10 次重定向。 我们只接受目标为“http:”或“https:”且端口为 80 或 443 的重定向。 我们不目标为 IP 地址的重定向。 当被重定向到 HTTPS 链接时,我们不会验证证书是否有效(因为验证的目的是申请有效证书,所以它可能会遇到自签名或过期的证书)。
HTTP-01 验证只能使用 80 端口。 因为允许客户端指定任意端口会降低安全性,所以 ACME 标准已禁止此行为。
优点:
- 它可以轻松地自动化进行而不需要关于域名配置的额外知识。
- 它允许托管服务提供商为通过 CNAME 指向它们的域名颁发证书。
- 它适用于现成的 Web 服务器。
缺点:
- 如果您的 ISP 封锁了 80 端口,该验证将无法正常工作(这种情况很少见,但一些住宅 ISP 会这么做)。
- Let’s Encrypt 不允许您使用此验证方式来颁发通配符证书。
- 您如果有多个 Web 服务器,则必须确保该文件在所有这些服务器上都可用。
DNS-01 验证
DNS-01 验证
此验证方式要求您在该域名下的 TXT 记录中放置特定值来证明您控制域名的 DNS 系统。 该配置比 HTTP-01 略困难,但可以在某些 HTTP-01 不可用的情况下工作。 它还允许您颁发通配符证书。 在 Let’s Encrypt 为您的 ACME 客户端提供令牌后,您的客户端将创建从该令牌和您的帐户密钥派生的 TXT 记录,并将该记录放在
_acme-challenge.<YOUR_DOMAIN>
下。 然后 Let’s Encrypt 将向 DNS 系统查询该记录。 如果找到匹配项,您就可以继续颁发证书!由于颁发和续期的自动化非常重要,只有当您的 DNS 提供商拥有可用于自动更新的 API 时,使用 DNS-01 验证方式才有意义。 我们的社区在此处提供了此类 DNS 提供商的列表。 您的 DNS 提供商可能与您的域名注册商(您从中购买域名的公司)相同或不同。 如果您想更改 DNS 提供商,只需在注册商处进行一些小的更改, 无需等待域名即将到期。
请注意,将完整的 DNS API 凭据放在 Web 服务器上会显着增加该服务器被黑客攻击造成的影响。 最佳做法是使用权限范围受限的 API 凭据,或在单独的服务器上执行 DNS 验证并自动将证书复制到 Web 服务器上。
由于 Let’s Encrypt 在查找用于 DNS-01 验证的 TXT 记录时遵循 DNS 标准,因此您可以使用 CNAME 记录或 NS 记录将验证工作委派给其他 DNS 区域。 这可以用于将
_acme-challenge
子域名委派给验证专用的服务器或区域。 如果您的 DNS 提供商更新速度很慢,那么您也可以使用此方法把验证工作委派给更新速度更快的服务器。大多数 DNS 提供商都有一个“更新时间”,它反映了从更新 DNS 记录到其在所有服务器上都可用所需的时间。 这个时间可能很难测量,因为这些提供商通常也使用任播,这意味着多个服务器可以拥有相同的 IP 地址,并且根据您在世界上的位置,您和 Let’s Encrypt 可能会与不同的服务器通信(并获得不同的应答)。 最好的情况是 DNS API 为您提供了自动检查更新是否完成的方法。 如果您的 DNS 提供商没有这样的方法,您只需将客户端配置为等待足够长的时间(通常多达一个小时),以确保在触发验证之前更新已经完全完成。
您可以为同一名称提供多个 TXT 记录。 例如,如果您同时验证通配符和非通配符证书,那么这种情况可能会发生。 但是,您应该确保清理旧的 TXT 记录,因为如果响应大小太大,Let’s Encrypt 将拒绝该记录。
优点:
- 您可以使用此验证方式来颁发包含通配符域名的证书。
- 即使您有多个 Web 服务器,它也能正常工作。
缺点:
- 在 Web 服务器上保留 API 凭据存在风险。
- 您的 DNS 提供商可能不提供 API。
- 您的 DNS API 可能无法提供有关更新时间的信息。
其中 HTTP-01 就是用的最多的验证方式,我这几年一直在用的就是它:
1 |
|
如官方所言,这种方式不支持通配符域名证书,所以这几年我一直在靠定时脚本来管理,比较费心
2 开始操作
今天要更换的就是方法是采用 Cloudflare API 来进行自动化申请、续期、通配符域名证书。
2.1 获取 Cloudflare API 令牌
访问2来获取你的 API 令牌,至于为什么选用 Cloudflare,参考 提供了自动更新 API 的 DNS 提供商的列表,Cloudflare 是比较出名的一家
2.2 使用 NginxProxyManager (NPM)
NginxProxyManager 的安装过程很简单,它的开发者官方提供了官方制作的 Docker 镜像,网上文章也很多,这里不提。
进入到 NginxProxyManager 平台,平台默认账号官方文档提到过:admin@example.com|changeme
,首次登录平台会要求重新设置密码,密码设置成功后重新登录系统,切换到 SSL Certificates 的标签页,点击右侧 Add SSL Certificate 按钮,申请一个新的域名证书,如下图:
然后稍等一会儿,NPM 就会将证书申请下来了,这个证书可以在 NPM 中直接配置,也可以从 NPM 的服务器上复制到其他服务器使用,
2.3 其他事项
三级域名注意事项4:
如果你的服务需要部署在三级域名的情况下,*.yourdomain.com
这种通配符域名证书是不可以的,你应该申请 *.subname.yourdomain.com