问题 我可以从HTTP客户端获取TLS秘密来解密我自己的HTTPS会话吗?


我正在建立一个像代理一样的网站记录器,以便持续测试网络抓取工具。它分为三个Docker容器,全部在GNU / Linux上:(1)代理,(2)API和请求队列,(3)简单的Web应用程序。

它适用于HTTP站点:我单击Web应用程序中的一个按钮,这会向API容器发出请求,并向内部请求队列添加内容,然后通过代理请求站点。代理在网站通过时记录该网站。

但是,我忘记了一个人无法记录HTTPS网站流量,现在我来实现这一点,我发现代理只是使用了 CONNECT 动词,然后充当客户端和目标之间的数据交换器。我相信我不能重放相同的数据块,因为加密的一部分使用随机的,一次性的,对称密钥(但是我有一个适合测试它的脚本,所以我只是为了教育价值而这样做!)。

所以,我想知道我的抓取客户端是否可以放弃代理系统解密字节流的足够秘密?我正在使用Wget来执行获取,我想这将使用OpenSSL。它不需要是Wget:如果我使用的是PHP脚本 file_get_contents 有了一个流上下文,我可以问一下 openssl模块 对于解密密钥?

(公平地说,即使有可能,我也不会以这种方式解决问题,我只是认为学习更多关于TLS的内容真的很有趣。在实践中,我会记录一个针对所有人的“空”条目在代理中保护网站,并要求请求服务通过API调用通知代理头/正文数据,以便以后可以回放。他们当然会有这些项目的明文副本)。


9606
2018-03-29 13:02


起源

@jww:关于你的编辑,我的问题不是关于OpenSSL库的明确问题,因为像Wget这样的客户端需要从OpenSSL访问加密机密才能将它们传递给解密程序吗? - halfer
对上述内容没有回应,所以恢复标签 - 请在再次修改之前联系。 - halfer
如果这是可能的,我会非常担心。 - miken32
顺便说一句,如果这是一个商业项目,我建议使用现有的HTTPS调试代理之一来做这件事,而不是试图编写自己的代理。我至少知道 fiddlerbook.com/fiddler/help/httpsdecryption.asp 和 charlesproxy.com/documentation/proxying/ssl-proxying 这样做,包括TLS展开。如果这是一个爱好或教育项目,以了解HTTPS,那么对你好,继续! - Rich
很好的建议,谢谢@Rich。目的是用于商业项目,但它只是用于测试而不是生产,并且在任何情况下,我都不需要通过在客户端中修改它们并在稍后在代理中更正它来处理代理中的TLS连接。我确实尝试了一个现成的解决方案(Wiremock),但它没有按照我的意图工作,我不得不退出一些工作。至少如果我写它,我将能够修改它 :-)。 - halfer


答案:


是的,我认为你有几个选择。

HTTPS专门设计用于阻止 “中间人”袭击 和窃听者,这实际上是你想要实现的目标。你可以打破它的一些假设,并打败它。

在SSL连接开始时,1。远程服务器显示其公钥及其证书,2。客户端验证证书,3。发送使用服务器公钥加密的会话密钥。有关详细信息,请参阅 SSL或TLS握手概述

在您描述的场景中,您有两种可能的方法来规避此保护:

1.重写TLS数据,用您自己的服务器替换服务器的证书和密钥

由于您控制了通信通道,因此您可以在步骤(1)中将服务器的公钥和证书替换为您控制的公钥和证书。如果您然后要求客户端使用。跳过步骤(2) --no-check-certificate 论证 wget,您就可以完全访问加密数据。

这就是Fiddler调试代理允许访问HTTPS流量的方法,请参阅 https://www.fiddlerbook.com/fiddler/help/httpsdecryption.asp

2.从客户端应用程序中检索会话密钥

由于客户端应用程序知道会话密钥,如果您可以提取它,则可以解密该流。我想这就是你在这个问题中想到的。

wget 本身没有允许记录会话密钥的选项(参见“HTTPS(SSL / TLS)选项“),但它确实看起来像它的TLS库,”GnuTLS“有一个调试选项,可以做你想要的,请参阅 GnuTLS文档中的“调试和审核”

SSLKEYLOGFILE   设置为文件名时,GnuTLS会在其中附加NSS密钥日志格式的会话密钥。 wireshark可以读取该格式,并允许解密会话以进行调试。

尝试设置 SSLKEYLOGFILE 环境变量到文件名,看看是否 wget 然后将您的TLS会话密钥记录到该文件?您可能需要重新编译 wget 使用调试版本 GnuTLS。我自己没试过。


10
2018-04-09 11:51



优秀,2号看起来非常接近我的想法,但1号非常有趣 - 谢谢!我需要在这里阅读... - halfer
我很高兴将此标记为现在的答案,但是如果其他人想要对它进行一次射击,它将在剩余的运行中留下赏金! - halfer
再次感谢您对此的帮助。我目前与其他工作捆绑在一起,但是当我可以尝试你建议的环境变量时,我会回来。赏金是你的! - halfer