如何使用Wireshark解密由C# HTTP客户端发送的HTTPS消息?

9
我们有一个使用HttpWebRequest发送HTTPS请求到另一个Web服务的.Net 4.6.1服务。我们正在尝试捕获此请求中的问题,以便我们可以向外部服务的所有者发送数据日志。我们有请求/响应的Wireshark跟踪,但无法解密它。远程服务是Java,但这不应该有影响。
我们发现了这篇非常有信息量的文章,但它是通过浏览器引用HTTP的。 https://security.stackexchange.com/questions/35639/decrypting-tls-in-wireshark-when-using-dhe-rsa-ciphersuites/42350#42350 我们能否以某种方式获取用于解码请求的私有RSA密钥?这对解密HTTPS响应不起作用,对吗? 生成SSL keylog文件能解决此问题吗?如果可以,我们可以修改我们的代码以生成该文件吗? 还有其他解决方案吗?谢谢。

Wireshark可以做到,但是如果协议使用了完美向前保密(Perfect Forward Secrecy),你需要远程服务器的私钥,否则它将无法完成。 - LB2
早就猜到了。我们能解密 HTTPS 请求吗? - MonkeyWrench
2个回答

3
我想到了一个解决办法,只要你的网络基础设施允许。
  1. 重新配置客户端应用程序,通过HTTP(而不是HTTPS)调用远程服务器
  2. 使用代理并配置客户端通过代理发送请求。
  3. 配置代理通过HTTPS(并转发到远程服务器)
  4. 使用Wireshark捕获客户端和代理之间的请求。
你将拥有请求和响应。 请求应该是相对干净的形式,响应可能会有一些额外的头文件(如Via:)来自代理,但不应妨碍您的故障排除。

是的...我想我们可以这样做。我不知道是否有一个代理可以为我们做到这一点。我猜我可以写点什么。我们已经更改了我们内部客户端代码以记录请求/响应正文和头文件,但希望有客户端能够更信任的东西,而不仅仅是我们自己编写的日志。因此选择使用 Wireshark。走代理路线会增加这个过程的时间和精力。谢谢。 - MonkeyWrench
如果我没记错的话,Paros代理可以做到这一点。我相信它有请求重写规则引擎,尽管它已经有一段时间没有维护了。也许OWASP ZED也可以做到?如果有什么问题,那将成为SO管理员/DevOps网站上的一个好帖子 :) 绝对不要编写自己的代码。 - LB2

2
打开应用程序的系统日志可能会有所帮助。您可以设置应用程序的配置文件以打开并将其写入文件中。这些日志将不加密,并显示请求/响应和更多信息。
以下是一个示例,请将其命名为[应用程序名称].exe.config并将其放置在与.exe相同的目录中。
<configuration>
    <system.diagnostics>
        <trace autoflush="true"/>
        <sources>
            <source name="System.Net" maxdatasize="10240">
                <listeners>
                    <add name="TraceFile"/>
                </listeners>
            </source>
            <source name="System.Net.Sockets" maxdatasize="10240">
                <listeners>
                    <add name="TraceFile"/>
                    <!-- 
                    Commented this out because it can cause the program to slow down when running from the command line and console output is enabled
                    <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/> 
                    -->
                </listeners>
            </source>
        </sources>
        <sharedListeners>
            <add name="TraceFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="trace.log"/>
        </sharedListeners>
        <switches>
            <add name="System.Net" value="Verbose"/>
            <add name="System.Net.Sockets" value="Verbose"/>
        </switches>
    </system.diagnostics>
</configuration>

您可能希望去掉System.Net跟踪,只记录System.Net.Sockets


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接