如何在内部网络上运行正确的 HTTPS?

信息安全 tls dns
2021-08-08 01:17:28

这个问题已经被问过好几次了,我将链接几个:

然而,这些都是老问题,我知道,至少在某些方面,提供的答案已经过时了。我正在提供我的研究,希望我能找出它的哪些部分已经过时,哪些部分仍然很好。我正在寻找现代答案。

这个问题很简单,但情况就是这样。我有访问敏感信息的网络服务(从角度来看:这对我们的公司和我们的客户都不利,但可能不会危及任何一方的生命)。我想提供对这些系统的轻松访问,但安全性显然很重要。(其中一些服务是通过非浏览器客户端访问的,如 Web 服务。有些只是人类在现代浏览器中使用的网页。)

为此,我们保持最重要的服务只能在内部访问。这样,攻击者 a) 不太可能意外发现它们,并且 b) 有一个额外的障碍需要克服。

然而,“深度安全”建议我们也在内部加密流量。这使得网络内部的人更难以随意从网络上嗅出密码。

本着“做我的功课”的精神,我收集了几种选择,有些不如其他选择。我不完全确定其中哪些现在是可行的,因为我知道一些规则已经改变。

自签名证书

大多数时候,这似乎是这个问题的“首选”答案。这为随意嗅探问题提供了阻力,但我必须告诉所有员工“大的讨厌的警告页面很好,只需点击它”。我一直在努力训练他们永远不要忽略该页面,他们中的大多数人不会理解“当您知道并期望该站点使用自签名证书时,该页面有时还可以”的细微差别(他们倾向于停止在逗号处聆听:))。

自签名证书,但在每个系统上都安装和信任

我认为这修复了讨厌的页面,但我必须将其设置为在访问它的每台计算机上都受信任。这是可能的,但不可取。

此外,我不能 100% 确定这对于内部地址是否可行。我的理解是,现代浏览器应该拒绝任何声称可以证明解析为非公共 IP 地址或不完全合格的机器的证书。

此外,在移动设备上安装系统根证书的过程……基本上是不可能的。它需要有根的 Android 手机,以及 iOS 设备的相对神秘的过程。

设置我自己的 CA

已安装和受信任的证书基本上存在相同的问题,但我只需要安装根证书,而不是为我支持的每个系统安装一个证书。仍然基本上关闭了所有移动设备,包括经理喜欢在会议中使用的平板电脑。

我更不相信这会起作用,因为 IP 将是内部的,而 DNS 将不是完全合格的。

使用公共证书,但用于内部地址。

我们可以配置完全限定地址(如“secret.private.example.com”)以解析为内部地址(如“192.168.0.13”)。然后,我们可以为这些公共 DNS 名称使用证书(甚至可能为“*.private.example.com”使用通配符证书)。

这可能有效,也可能无效,甚至可能不是一个好主意。浏览器可能会拒绝尝试解析为本地地址的证书。

如果它确实有效,那可能不是一个好主意。从我们的内部系统带到另一个网络的笔记本电脑(可能非常快,通过 VPN 断开连接)可能会尝试访问其他网络上本地 IP 地址的秘密内容。只要 HSTS 生效,这应该没什么大不了的,因为没有我们的私钥,他们将无法说服客户端接受伪造的站点,也无法强制降级到 HTTP。但这似乎是不可取的,它打破了(也许?)最近生效的“公共 DNS 中没有私有地址”规则?

所以,所有这些要说......正确的答案是什么?我可以“放弃”并公开公开私人服务,相信加密和特定于应用程序的身份验证要求将确保事情安全。确实,对于一些不那么敏感的东西,这是一门不错的课程。但我担心特定于应用程序的身份验证可能有问题,或者凭据以其他方式受到损害(人总是最薄弱的环节),如果完全合理的话,我希望有一个额外的障碍。

4个回答

完成证书验证以确保对等点是您期望的对等点。在浏览器中验证服务器证书主要是通过检查 URL 中的主机名是否与证书中的名称匹配,并且您可以构建到本地受信任 CA 证书(即存储在浏览器中的根证书)的信任链或操作系统)。此外,还有到期和撤销检查。

为确保此过程按预期工作,证书颁发者必须验证您确实拥有证书中的主机名。这意味着,如果您能证明您拥有此名称,您只能获得由公共 CA 颁发的证书,这通常涉及具有此名称的主机是公开可见的 - 至少对于完成自动验证的廉价证书而言。当然,您可以通过实际公开可用的主机名(即可通过 访问的单个服务器*.example.com)来解决此问题,然后将颁发的证书用于您的内部系统。

(错误)以这种方式为内部系统使用公共 CA 有点丑陋,但应该可以正常工作。您仍然需要互联网连接,因为撤销检查将使用来自 CA 的信息,即来自本地网络之外的信息。这可以通过使用 OCSP 装订以某种方式受到限制,但并非所有客户端和服务器都支持这一点。如果您不允许您的客户端向外部 CA 请求撤销信息,则连接设置有时可能会很慢,因为客户端尝试获取撤销信息失败。

因此使用公共 CA 应该是可能的,但有缺点,感觉就像以错误的方式使用 CA 系统 - 所以我不推荐它。处理大量证书时,唯一的另一种选择是使用您自己的本地 CA。但是就像您自己意识到的那样,这意味着在您的所有本地系统上安装和信任根证书(这对于某些系统可以自动化)。这也意味着您确实必须保护这个本地 CA 不被滥用,因为它不仅限于颁发本地证书,而且理论上还可以为任何公共域(如 google.com)颁发证书。而且由于您所有的本地系统都信任此 CA,因此它们也会信任此证书。此外,当颁发者 CA 被明确添加为受信任时,在大多数系统中都不会检查证书固定。

这意味着没有一个真正好的选择:要么将公共 CA 用于具有所有缺点的内部主机,要么创建自己的具有所有缺点的 CA。我相信还会有公共 CA 可以帮助您解决这个问题,但这可能会比您想要的更昂贵。

“使用公共证书,但用于内部地址。”

这个选项效果很好,这就是我们所做的。

您实际上可以进行 HTTP 验证,证书不包含 IP 地址,仅包含 DNS 名称。因此,您可以将您的 DNS 指向外部服务、验证,然后将其指向内部 IP。

但如果您的 CA 支持 DNS 验证,它的效果会更好,因为您不必在每次需要更新时都更改条目。SSL 证书所做的只是验证您控制名称,因此如果您可以创建子域条目,那么您显然可以控制名称。

Letencrypt 的说明:https ://serverfault.com/questions/750902/how-to-use-lets-encrypt-dns-challenge-validation

更新:更好的机制的更好说明:https ://jsavoie.github.io/2021/06/01/letsencrypt.html

我自己也一直在研究这个,只是在一些内部 Web 应用程序上实现了 https。

首先在我们的内部 DNS 服务器上,我设置了一个新的正向查找区域 corp.domain.com 然后在其中设置一些 A/Cname 记录,webapp1.corp.domain.com 指向我们的内部 LAN IP

现在我们已经拥有 *.domain.com 的通配符 SSL 证书,因此我的证书请求中,我为 webapp1.corp.domain.com 创建了一个重复的 SSL 证书

将此安装到我们的 IIS 并在浏览器中显示为 SECURE :)

到目前为止,我发现的最佳解决方案是使用反向代理(例如 Caddy)来处理证书(颁发和续订),设置 DNS 服务器以将所有内部主机名指向 Caddy 服务器,一切都会自动运行。如果您只想限制对内部的访问,您可以关闭端口 80,直到您的证书需要续订。