我们设置了一台生产服务器和一个测试环境,它们是两个具有不同内部 IP 地址的虚拟机。我们的公共 DNS 服务器将 software.example.com 指向我们的公共 IP 地址。如果您想使用生产服务器,请输入https://software.example.com如果你想访问服务器进行测试,你可以使用https://software.example.com:10443。然后我们的防火墙会将请求重定向到正确的内部 IP。
这对于外部使用来说已经足够了,因为我们可以为两台服务器使用相同的 SSL 证书(因为它们使用相同的 FQDN)。但我们需要为生产服务器使用内部 IP,因为即使互联网连接中断,它也应该可用。所以我对生产服务器的内部 IP 使用了 A 记录。
现在我们无法使用DNS名称打开测试网站,因为software.example.com内部指向了生产服务器,我们只能使用内部IP如192.168.1.10:10443,这会导致SSL证书错误。
您知道解决这个问题的方法吗?我想找到一种方法,让地址 software.example.com 在两个服务器内部都可以使用。我不希望仅通过互联网连接即可访问该网站。
我可以对测试环境使用不同的证书,但我必须使用 let's encrypt,使用我们从提供商处获得的付费证书的方法会更好。
感谢您的建议。
答案1
您有以下几种选择:
- 在两台服务器前面内部安装负载平衡器/反向代理,并将域指向
software.example.com
反向代理的 IP,这样您就可以使用与外部相同的设置。例如,可以使用 NGINX、MS IIS 或 F5 来完成此操作。 - 您还可以使用运行生产环境的 Web 服务器将请求内部转发到测试环境。这当然要求生产服务器上的 Web 服务器支持反向代理配置。这还有一个额外的好处,就是为您节省了额外的服务器。
- 为测试环境设置不同的域名,例如
software-testing.example.com
,并在该服务器上安装不同的证书。我认为这是最干净的选择,因为您不共享任何基础设施,而且与运行和维护额外的服务器相比,SSL 证书相当便宜。
答案2
要直接回答标题中的问题,你可以使用存储区域网络(主题备用名称)字段。SAN 允许单个证书对两个(或更多)主机名有效。
不过,从问题主体来看,您似乎更感兴趣的是拥有一个始终可以到达内部服务器的名称,即使外部网络不可用,而不是拥有一个对多个名称有效的证书。有几种方法可以做到这一点。以下是首先想到的几种:
设置一个内部 DNS 服务器,该服务器专用于您的网络,并为内部机器返回内部 IP 地址(例如,software.example.com 的 IP 地址为 192.168.1.10),并将请求转发到外部 DNS 服务器(例如,您的 ISP 或 8.8.8.8)以获取非内部名称。如果您已经拥有内部 DNS 服务器,这是“最正确”且最简单的解决方案,但是,如果您还没有内部 DNS 服务器,则必须设置一个并重新配置所有内部机器以使用它。
在所有内部机器上配置一个“hosts 文件”(
/etc/hosts
在 Linux 上,在 Google 上查找 Windows、OS X 或其他操作系统上的位置),告诉它们 software.example.com 位于 192.168.1.10,而无需通过 DNS。这与 #1 具有同样的一般效果,但设置和维护工作量要大得多。它的唯一优点是避免了设置内部 DNS 服务器。告诉您的内部用户始终使用 IP 地址或备用名称进行内部访问,无论您的互联网是通还是断。如果您的证书上没有相应的 SAN,当他们的浏览器抱怨证书无效时,他们可以“接受风险并继续”。如果您没有 SAN,这是一个非常“不正确”的解决方案(因为它涉及忽略浏览器安全警告),但如果您没有为任何其他解决方案准备好网络基础设施,这是最容易实现的。
如果您有一个可配置的路由器来处理内部网络的流量,您可以将其设置为将服务器外部 IP 地址的流量直接发送到服务器,而无需将其路由到互联网连接并返回。无论连接是打开还是关闭,这都会使内部可见的 IP 地址保持不变,但这是最深奥的解决方案,因此如果您这样做,应该有充分的文档记录,以避免将来某个时候需要调试路由问题的人(很可能是您自己)感到困惑。如果您在连接断开时无法访问外部 DNS 服务器,那么它可能也无济于事 - 这让我们回到“设置内部 DNS 并使用解决方案 #1”。