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

hal*_*fer 11 php https proxy openssl wget

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

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

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

所以,我想知道我的提取客户端是否可以放弃代理系统解密字节流的足够秘密?我正在使用Wget进行获取,我想这将使用OpenSSL.它不需要是Wget:如果我使用file_get_contents带有流上下文的PHP脚本,我可以向openssl模块询问解密密钥吗?

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

Ric*_*ich 10

是的,我想你在这里有几个选择.

HTTPS专门用于阻止"中间人"攻击和窃听者,这本质上是你想要实现的目标.你可以打破它的一些假设,并打败它.

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

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

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

由于您控制了通信通道,因此您可以在步骤(1)中将服务器的公钥和证书替换为您控制的公钥和证书.如果然后要求客户端使用--no-check-certificate参数to跳过步骤(2)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.我自己没试过.