我刚刚意识到 SSL 中间人攻击比我想象的要常见得多,尤其是在企业环境中。我听说过并亲眼见过几家企业安装了透明的 SSL 代理服务器。所有客户端都配置为信任此代理的证书。这基本上意味着雇主理论上可以拦截 SSL 加密流量,而无需在浏览器中弹出任何警告。如上所述,客户端附带受信任的证书。这只能通过手动验证正在使用的证书来揭示。
在我看来,这似乎是雇主利用其优越地位监视员工的 SSL 流量。在我看来,这使得整个 SSL 概念变得不可信。我自己使用 mitmproxy 成功测试了类似的设置,并且能够读取客户端与我的电子银行服务器之间的通信。这些信息不应该向任何人透露。
因此,我的问题很简单:如何在服务器端验证信任链?我想确保客户端使用我的服务器的证书和只有一个信任链。我想知道这是否可以通过 Apache 的 SSL 配置来实现?这将很方便,因为它可以轻松应用于许多应用程序。如果这不可能,有人知道在 PHP 中执行此操作的方法吗?或者您还有其他建议吗?
答案1
我认为这个问题更适合security.stackexchange.com许多问题都讨论了 MITM 的话题。但无论如何:
服务器证书的验证仅在客户端完成,并且不能以某种方式转移到服务器,因为在客户端验证证书的目的是,客户端需要确保它正在与正确的服务器通信,并且不能信任(不受信任的)服务器为客户端做出这个决定。
如果发生 SSL 拦截,从服务器的角度来看,TLS 客户端就是 SSL 拦截防火墙/AV。因此,服务器端的问题是检测它是否正在与预期的客户端(浏览器)对话(防火墙/AV)。最安全的方法是使用客户端证书来验证客户端 - 事实上,如果使用客户端身份验证,SSL 拦截将不起作用,即 TLS 握手将失败,因为 MITM 无法提供预期的客户端证书。
只是,客户端证书很少使用。此外,TLS 握手失败并不意味着客户端可以在没有 SSL 拦截的情况下与服务器通信,而是客户端根本无法与服务器通信。另一种方法是使用一些启发式方法根据 TLS 握手的指纹(即密码的种类和顺序、特定扩展的使用)检测 TLS 客户端的类型……虽然 SSL 拦截代理理论上可以完美模拟原始 ClientHello,但大多数都不能。另请参阅检测服务器端的 HTTPS 中间人攻击或部分III TLS 实施启发式方法在HTTPS 拦截的安全影响。
答案2
答案3
那是错误的方式。不是服务器检查信任链。而是客户端。因此,公司使用这种方式的原因是为了保护公司环境并检查员工在工作时间所做的事情。
答案4
你可以(有点),但真正的问题是你是否应该。
但要注意,它并不像改变 apache.conf 中的标志那么简单。
此外,由于“攻击者”(例如雇主)控制着客户端计算机,因此他们可以总是挫败你的企图如果他们愿意投入足够的努力(从好的方面来看,除非你是大鱼,否则它们很可能不会倾向于这样做,所以你将实现你的目标,即你的用户将无法连接到你,除非它是安全的))
你可以在 javascript 中重新实现 TLS,并检查客户端连接的证书是否是您网站的证书。
如果你很幸运, 用户可能正在使用浏览器客户端 Javascript 可以获取有关所使用的远程证书的信息(从而轻松地根据服务器证书的硬编码值进行验证)。
你可以使用 JavaScript 来运行您的自定义加密。因此,即使该公司的邪恶 TLS MiTM 成功了,它仍然不会允许其访问您的数据。当然,如果有足够多的人感兴趣(并且由于他们控制着客户端),他们可以即时用他们自己的 JavaScript 替换您的安全 JavaScript,同时记录(或更改)传输中的所有信息。
此外,由于使用 TLS MiTM 代理的企业通常也完全控制客户端计算机,因此他们可以轻松安装屏幕和键盘记录器,以简单地记录用户看到的所有内容的视频,并记录用户输入的所有击键(和鼠标移动)。如您所见,当攻击者是客户,没有绝对安全的方法来欺骗他。这真的只是一个问题,他们会花多少心思... 上面的一些解决方案可能对你来说已经足够好了。