一年多来,我一直在使用从一个 Linux 机器到另一个机器的一些脚本来做这件事。让我概述一下我在做什么,因为我将无法共享脚本。此外,您在一端使用 Windows,因此某些 shell 脚本将毫无用处。
certbot
客户端使用一个众所周知的 URI/.well-known
来放置用于通过 HTTP 进行自动域验证的令牌文件(使用webroot
身份验证器/插件)。
现在,我对位于您的案例 123.123.123.2 上的少数域所做的就是在 123.123.123.1 上启用 HTTP(即端口 80)foo.example.com
并bar.example.com
分别为 和 配置虚拟主机。
然后将该虚拟主机配置为(在 Nginx 中)指向 URI 的物理位置,/.well-known
以便certbot
能够将令牌文件放入该路径:
location /.well-known/ {
alias /your/path/.well-known/;
autoindex on;
try_files $uri $uri/ =404;
limit_except GET {
deny all;
}
}
通过这种方式,我可以使用webroot
验证器certbot
并指向所述“假域”的 Web 根目录(它是假的,因为它是 123.123.123.1 上的虚拟主机,而该域的 DNS 条目指向 123.123.123.2)。
现在这不是结束,而是第一步。
在 DNS实际指向的另一台机器上,我安装rinetd
了指向端口 80 上的 123.123.123.1(运行 certbot 的机器)。/etc/rinetd.conf
这看起来像:
127.0.0.1 8080 123.123.123.1 80
同时,/.well-known
对站点foo.example.com
和bar.example.com
123.123.123.2 的任何请求都被静默代理到 127.0.0.1 端口 80,同时保留 HTTP 参数(主机名和 URI 不变)。
例如,通过使用这种方法certbot
(在 .1 上运行)将创建一个令牌文件/your/path/.well-known/foobar
,Letsencrypt 将尝试访问http://foo.example.com/.well-known/foobar
. 该请求将 - 像往常一样 - 最终出现在 DNS 记录指向的机器上。所以它最终在 .2 上结束,其中 HTTP 服务器配置为将 URI 下的项目请求静默转发/.well-known
到 127.0.0.1 端口 8080,该端口rinetd
用于将数据包转发到 123.123.123.1 端口 80。因此我们关闭了圆圈,certbot 将能够执行其域验证例程。
唉,我在 Linux 上运行它,所以你的设置似乎是一个 Windows 服务器,你必须找到(或创建)类似rinetd
Windows 的东西。尽管这可能没有直接帮助,但也许它可以帮助其他人在两个 Linux 机器上遇到类似问题。
整个rinetd
例程旨在使 123.123.123.1 的 HTTP 标头完好无损,以便该域的虚拟主机在 123.123.123.1 上生效。
使用这个例程,我的一台服务器可以更新一系列实际托管各个子域的其他机器。
哦,另一个注意事项。您的场景只是一个非常明确的场景。如果您想运行 XMPP 或 MTA,并且服务的查找不仅仅与 A/AAAA 或 CNAME 记录的 DNS 查找严格相关,那么您最终会遇到在技术上与您的情况相同的情况.
如果有人对如何解决这个问题有更聪明的想法,请在对此答案的评论中给我留言。