在受控环境中,MitM 可以使用哪些工具通过 MTLS 流量解密+中继 HTTPS 与 SNI?

信息安全 tls 证书 http 中间人
2021-08-20 23:23:29

我在两个通过 HTTPS 通信的封闭设备之间有一个完全受控的环境(路由、DNS、CA、私钥、证书)。流量通过双向 TLS 认证通道,使用服务器名称指示以及椭圆曲线密钥。

我需要一个工具(或一组工具),它可以使用我现有的客户端和服务器私钥和证书,以及能够执行 SNI,将服务器“模拟”到客户端,复制/转储解密流量,然后中继流量好像来自客户端,反之亦然。

我不能对设备本身做太多事情(例如排除 EC/DH 密钥,以允许在稍后阶段对流量进行简单解密),但我拥有所有证书和私钥,我可以手动将流量发送到我想要的地方,我不需要特殊的代理技巧。

我在将 openssl s_client / s_server + tee 放入管道中取得了一些成功,但这似乎在一个连接后就中断了。

我尝试过的其他工具要么无法处理 SNI,要么坚持“伪造”证书,这是我真的不需要或不想要的(特别是如果伪造的证书不符合我/应用程序的要求)并且通常比我的更通用需要。

我不是在寻找商业级设备或软件,我不需要可能的解决方案来生成证书。我有它们,还有私钥。

我需要一些可以使用提供的 PK/cert/chain 监听 tcp/443 并建立 TLS 会话,存储/转储未加密数据,然后在另一个使用 SNI 的 TLS 会话中重播从客户端接收到服务器的内容和提供的客户端 PK/cert/chain 尽可能与原始的匹配。它应该能够在同一个 TLS 会话以及多个(如串联,而不是并行)连接上处理和中继响应数据。我需要在两个众所周知的盒子之间严格捕获流量。

2个回答

哦,很好,从 1.7.8 开始,Nginx 支持proxy_ssl_certificate[_key]指令,这些指令完全符合您的需要。分别设置一个反向代理,将服务器证书和密钥路径分别放入ssl_certificatessl_certificate_key指令中,并以类似的方式通过proxy_ssl_certificate和添加客户端证书和密钥proxy_ssl_certificate_key

不要忘记通过ssl_client_certificate指令启用客户端证书身份验证。您的客户端 CA 证书应该用于此目的。这是一个简单的教程

通过在客户端指定不同的指令并在代理端server添加相应的proxy_ssl_server_name指令来支持 SNI。

PS 这个问题与我认为与这个问题重复的问题之间的区别在于您不想即时生成客户端证书(无论如何 Nginx 都无法为您做)。

我建议使用 mod_proxy 和 mod_dumpio 尝试 Apache。您可以使用 mod_headers 复制客户端身份验证标头 -请参见此处