C libcurl—是否可以获取原始格式的请求数据

C libcurl—是否可以获取原始格式的请求数据,c,libcurl,C,Libcurl,在Libcurl C中,使用CURLOPT_DEBUGFUNCTION可以设置回调函数。Libcurl调用callback并为 卷发信息\u标题\u输入 卷曲信息\u标题\u输出 CURLINFO\u数据\u输入 卷曲信息\u数据\u输出 CURLINFO\u SSL\u数据\u输入 卷发信息\u SSL\u数据\u输出 为CULLINFO\u SSL\u data\u OUT提供的发送数据为二进制格式(加密)。我需要相应的原始数据(未加密) 有可能吗?如果您想查看实际传输的内容,我建议使用中间

在Libcurl C中,使用CURLOPT_DEBUGFUNCTION可以设置回调函数。Libcurl调用callback并为

  • 卷发信息\u标题\u输入
  • 卷曲信息\u标题\u输出
  • CURLINFO\u数据\u输入
  • 卷曲信息\u数据\u输出
  • CURLINFO\u SSL\u数据\u输入
  • 卷发信息\u SSL\u数据\u输出
  • 为CULLINFO\u SSL\u data\u OUT提供的发送数据为二进制格式(加密)。我需要相应的原始数据(未加密)


    有可能吗?

    如果您想查看实际传输的内容,我建议使用中间人HTTPS代理

    代理位于客户端和服务器之间

    当客户端通常通过HTTPS与服务器通信时,客户端会检查服务器的证书链,以查看它是否由系统信任的根证书签名

    因此,客户端和服务器之间的任何代理都只能转发数据,而无法查看加密的数据流

    那么它是如何工作的呢

    中间人代理拦截流量并动态创建服务器证书。因此,在客户端看来,它就像是在与服务器通信,反之亦然

    但是,如果客户端随后评估证书链,它将遇到它不知道的代理的根证书,因此不信任该根证书,并立即终止服务器通信(如果客户端配置正确)

    为了让代理可以查看HTTPS数据,您必须在客户端系统上的受信任根证书列表中包含代理根证书

    然后,代理可以显示所有数据,包括标题

    此类代理的一些典型代表如下(不完整列表):

    • mitmproxy()
    • 查尔斯()
    • 小提琴手()
    不同的方法有不同的优点和缺点。当您想要快速有效地分析请求和响应(包括标头)时,HTTPS代理尤其有用

    使用libcurl程序演示mitmproxy

    对于快速演示,可以使用libcurl站点的示例程序:

    在另一个终端窗口中,可以启动mitmproxy。当程序启动时,请求/响应出现在mitmproxy中,可以进行分析

    看起来是这样的:


    如上所述,您需要为不同的操作系统配置mitmproxy网站上所述的相应根证书。

    我强烈建议使用允许您使用诸如Wireshark之类的外部工具监视和捕获所有curl流量(TLS和非TLS)的方法


    无需在任何地方安装任何MITM软件或额外证书。也适用于链接到使用libcurl的应用程序,而不仅仅是curl本身。

    Er,这不就是header\u out+data\u out吗?CURLINFO\u header\u out,CURLINFO\u data\u out只提供正常情况下的数据(没有SSL/TLS)。对于SSL/TLS,它使用二进制数据调用CURLINFO_SSL_DATA_OUT。是否可以在SSL/TLS情况下获取原始数据?谢谢回答。我想在本地得到这些信息。我现在已经解决了。这很容易。标题部分带有CURLINFO_Header_IN,对于数据,我使用了read callback,其中数据被提供给curl。有了这个,我可以得到完整的信息。这不是一个好的答案,因为mitmproxy在HTTPS方面不使用libcurl,另外两个都不是免费的。@PhilippLudwig mitmproxy当然也可以使用HTTPS流量。我甚至认为这是该工具的主要用途:-)我在答案中添加了一个小演示。它基于libcurl网站上未经修改的libcurl示例程序,在mitmproxy中显示未加密的请求/响应和详细信息。@StephanSchlecht感谢您的演示,我非常感谢!谢谢你的回答。我希望它是实时的,我是按照我上面的评论做的。
    gcc -o simple simple.c -lcurl
    export https_proxy=localhost:8080