Apache:验证 SSL 信任链以防止 MITM 攻击?

Ail*_*n79 11 ssl ssl-certificate apache-2.2 mitmproxy

我刚刚意识到 SSL 中间人攻击比我想象的要普遍得多,尤其是在企业环境中。我听说并看到自己有几家拥有透明 SSL 代理服务器的企业。所有客户端都配置为信任此代理的证书。这基本上意味着雇主理论上可以拦截 SSL 加密的流量,而浏览器中不会弹出任何警告。如上所述,客户端带有受信任的证书。这只能通过手动验证正在使用的证书来揭示。

在我看来,雇主似乎利用其优越地位来监视员工的 SSL 流量。对我来说,这使得 SSL 的整个概念变得不可信。我自己使用 mitmproxy 成功测试了类似的设置,并且能够读取客户端和我的电子银行服务器之间的通信。这是不应该向任何人透露的信息。

因此,我的问题很简单:如何在服务器端验证信任链?我想确保客户端使用我服务器的证书和只有一个信任链。我想知道这是否可以通过Apache的SSL配置来实现?这将很方便,因为它可以轻松应用于许多应用程序。如果这是不可能的,有没有人知道在 PHP 中执行此操作的方法?或者您有其他建议吗?

HBr*_*ijn 14

在我看来,雇主似乎利用其优越地位来监视员工的 SSL 流量。对我来说,这使得 SSL 的整个概念变得不可信

问题不在于SSL概念,也不在于技术实现,而在于其他人可以完全控制连接的一个端点,即您的工作站。
这就是实际安全风险的根源......

从安全角度来看,是您的工作站遭到破坏,这破坏了在正常情况下阻止 MITM 成功的信任链。

如何验证服务器端的信任链?

你不能。这是客户端完成的。

根据您的用例,您可以做的是RFC 7469 HTTP 公钥固定,其中您向客户端发送了一个附加标头,其中包含您的实际 SSL 证书或您使用的 CA 的列表(散列)。

  • HPKP 将无济于事,因为如果证书由明确添加的 CA 签名,浏览器将忽略它。这样做是为了允许受信任方进行 SSL 拦截,即公司防火墙或本地桌面 AV(许多都进行 SSL 拦截)。 (4认同)
  • 你在那里是绝对正确的:RFC 的 2.6 节:*“根据本地政策,允许对某些主机禁用 Pin 验证是可以接受的。例如,UA 可能会禁用验证证书链终止的固定主机的 Pin 验证在用户定义的信任锚,而不是内置于 UA(或底层平台)的信任锚。”* (2认同)

Ste*_*ich 9

我认为这个问题更适合security.stackexchange.com,其中许多问题都讨论了 MITM 的主题。但无论如何:

服务器证书的验证仅在客户端完成,不能以某种方式移动到服务器,因为在客户端验证证书的要点是,客户端需要确保它正在与正确的服务器交谈并且不能信任(不受信任的)服务器为客户端做出这个决定。

在 SSL 拦截的情况下,从服务器的角度来看,TLS 客户端是 SSL 拦截防火墙/AV。因此,服务器端的问题是检测它是否正在与预期的客户端(浏览器)对话(防火墙/AV)。最安全的方法是使用客户端证书对客户端进行身份验证 - 事实上,如果使用客户端身份验证,SSL 拦截将不起作用,即 TLS 握手将失败,因为 MITM 无法提供预期的客户端证书。

只是,很少使用客户端证书。此外,失败的 TLS 握手并不意味着客户端可以在没有 SSL 拦截的情况下与服务器通信,而是客户端根本无法与服务器通信。另一种方法是使用一些启发式方法根据 TLS 握手的指纹来检测 TLS 客户端的类型,即密码的种类和顺序、特定扩展的使用......而 SSL 拦截代理理论上可以模拟原始ClientHello 完全没有。又见检测人在这方面的中间人在服务器端对HTTPS或者部分III TLS实施启发式HTTPS拦截安全的影响