Php 我可以从HTTP客户端获取TLS机密以解密我自己的HTTPS对话吗?

Php 我可以从HTTP客户端获取TLS机密以解密我自己的HTTPS对话吗?,php,https,proxy,openssl,wget,Php,Https,Proxy,Openssl,Wget,我正在构建一个像代理一样运行的网站记录器,以便持续地测试web scraper。它被分成三个Docker容器,都在GNU/Linux上:(1)一个代理,(2)一个API和请求队列,以及(3)一个简单的web应用程序 它适用于HTTP站点:我单击web应用程序中的一个按钮,这会向API容器发出请求,并向内部请求队列添加一些内容,然后该队列通过代理请求站点。代理在站点通过时记录该站点 然而,我忘记了不能记录HTTPS站点流量,现在我来实现它,我发现代理只使用CONNECT动词,然后充当客户端和目标之

我正在构建一个像代理一样运行的网站记录器,以便持续地测试web scraper。它被分成三个Docker容器,都在GNU/Linux上:(1)一个代理,(2)一个API和请求队列,以及(3)一个简单的web应用程序

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

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

所以,我想知道我的抓取客户机是否可以为代理系统提供足够的机密来解码字节流?我正在使用Wget进行提取,我想这将使用OpenSSL。不过,它不需要是Wget:如果我使用的是带有流上下文的PHP脚本,我可以向服务器请求解密密钥吗


(公平地说,即使有可能,我也可能不会以这种方式解决问题,我只是觉得学习更多关于TLS的知识会非常有趣。在实践中,我会记录一个“null”针对代理中所有安全网站的条目,并要求请求服务通过API调用通知代理标题/正文数据,以便稍后播放。它们当然会有这些项目的纯文本副本)。

是的,我认为您在这里有两个选项

HTTPS是专门为阻止和窃听而设计的,而这正是您试图实现的目标。你可以打破它的一些假设,并击败它

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

在您描述的场景中,有两种可能的方法可以绕过此保护:

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

这就是Fiddler调试代理允许访问HTTPS流量的方式,请参阅

2.从客户端应用程序检索会话密钥 由于客户端应用程序知道会话密钥,如果您可以提取它,那么就可以解密流。我想这就是你在这个问题上的想法

wget
本身没有允许记录会话密钥的选项(请参见“”),但它看起来确实像它的TLS库,“
GnuTLS
”有一个调试选项,可以执行您想要的操作,请参见:

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


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

@jww:关于您的编辑,我的问题不是很明确,因为像Wget这样的客户机需要访问OpenSSL的加密机密才能将它们传递到解密程序吗?上面没有回答,所以恢复标签-请在再次修改之前联系。如果可能的话,我会非常担心。顺便说一句,如果这是一个商业项目,我建议使用一个现有的HTTPS调试代理来做这件事,而不是尝试编写自己的代理。我知道至少有这样做,包括TLS展开。如果这是一个爱好或教育项目来学习HTTPS,那么很好,继续!好建议,谢谢@Rich。其目的是为了一个商业项目,但它只是为了测试而不是生产,在任何情况下,我都避免了在代理中处理TLS连接的需要,方法是在客户机中修改它们,然后在代理中更正它们。我确实尝试了一个现成的解决方案(Wiremock),但它没有像我预期的那样工作,我不得不放弃一些工作。至少如果我写了它,我将能够修改它
:-)
。太好了,第2号看起来很接近我的想法,但第1号很有趣-谢谢!我需要在这里读点书。。。