我正在建立一个像代理一样的网站记录器,以便持续测试网络抓取工具。它分为三个Docker容器,全部在GNU / Linux上:(1)代理,(2)API和请求队列,(3)简单的Web应用程序。
它适用于HTTP站点:我单击Web应用程序中的一个按钮,这会向API容器发出请求,并向内部请求队列添加内容,然后通过代理请求站点。代理在网站通过时记录该网站。
但是,我忘记了一个人无法记录HTTPS网站流量,现在我来实现这一点,我发现代理只是使用了 CONNECT
动词,然后充当客户端和目标之间的数据交换器。我相信我不能重放相同的数据块,因为加密的一部分使用随机的,一次性的,对称密钥(但是我有一个适合测试它的脚本,所以我只是为了教育价值而这样做!)。
所以,我想知道我的抓取客户端是否可以放弃代理系统解密字节流的足够秘密?我正在使用Wget来执行获取,我想这将使用OpenSSL。它不需要是Wget:如果我使用的是PHP脚本 file_get_contents
有了一个流上下文,我可以问一下 openssl模块 对于解密密钥?
(公平地说,即使有可能,我也不会以这种方式解决问题,我只是认为学习更多关于TLS的内容真的很有趣。在实践中,我会记录一个针对所有人的“空”条目在代理中保护网站,并要求请求服务通过API调用通知代理头/正文数据,以便以后可以回放。他们当然会有这些项目的明文副本)。
是的,我认为你有几个选择。
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
。我自己没试过。