7

我正在尝试使用 FiddlerCore 实现系统内 SSL 服务器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace fiddlerCoreTest
{
    using System.IO;
    using System.Threading;
    using Fiddler;

    class Program
    {
        static Proxy oSecureEndpoint;
        static string sSecureEndpointHostname = "localhost";
        static int iSecureEndpointPort = 7777;

        static void Main(string[] args)
        {
            //var tt = Fiddler.CertMaker.GetRootCertificate().GetRawCertData();
            //File.WriteAllBytes("root.crt",tt);

            Fiddler.FiddlerApplication.BeforeRequest += delegate(Fiddler.Session oS)
            {
                oS.bBufferResponse = false;               

                if ((oS.hostname == sSecureEndpointHostname)&&oS.port==7777)
                {
                    oS.utilCreateResponseAndBypassServer();
                    oS.oResponse.headers.HTTPResponseStatus = "200 Ok";
                    oS.oResponse["Content-Type"] = "text/html; charset=UTF-8";
                    oS.oResponse["Cache-Control"] = "private, max-age=0";
                    oS.utilSetResponseBody("<html><body>Request for httpS://" + sSecureEndpointHostname + ":" + iSecureEndpointPort.ToString() + " received. Your request was:<br /><plaintext>" + oS.oRequest.headers.ToString());
                }
            };

            FiddlerCoreStartupFlags oFCSF = FiddlerCoreStartupFlags.Default;
            oFCSF = (oFCSF & ~FiddlerCoreStartupFlags.RegisterAsSystemProxy);

            Fiddler.FiddlerApplication.Startup(8877, oFCSF);

            oSecureEndpoint = FiddlerApplication.CreateProxyEndpoint(iSecureEndpointPort, true, sSecureEndpointHostname);
            if (null != oSecureEndpoint)
            {
                FiddlerApplication.Log.LogFormat("Created secure end point listening on port {0}, using a HTTPS certificate for '{1}'", iSecureEndpointPort, sSecureEndpointHostname);
            }

            Console.WriteLine("Press any key to exit");

            Console.ReadKey();
        }
    }
}

在 firefox 中, GEThttp://localhost:7777/工作正常,但是当我 GET 时https://localhost:7777/,firefox 报告以下错误:

SSL 收到超过最大允许长度的记录

为什么我会得到这个,我该如何解决?

更新 仅当我使用 fiddler 作为 firefox 的代理时才会发生这种情况。当我删除提琴手代理时,我可以访问https://localhost:7777/. 但是,我也希望能够https://localhost:7777/通过代理访问

4

2 回答 2

1

这种情况下的问题是您要处理此流量两次:

首先,浏览器向端口 8888 发送一个 CONNECT 说:“请给我一个到端口 7777 的 TCP/IP 隧道”,然后在 Fiddler 说“好的,我们会这样做”之后,客户端通过该隧道发送一个 HTTPS 请求到端口7777。

这里的问题是您正在修改 CONNECT 响应并返回 HTML,而不是允许来自端口 7777 的 HTTPS 握手通过。

解决此问题的最简单方法是将您的 BeforeRequest 代码更改为以下内容:

if ( (oS.hostname == sSecureEndpointHostname) && (oS.port==7777)
    && !oS.HTTPMethodIs("CONNECT")) {

执行此操作后,您的 CONNECT 隧道将不再受到破坏,并且 HTTPS 握手将成功。

于 2014-04-03T17:50:29.663 回答
1

HTTPS 流量是加密的,fiddler 作为 Web 调试器代理无法解密/分析通过 fiddler 发送的数据包数据。它使用 MITM 攻击来解密通过提琴手发送的 SSL 流量,请参见此处: http ://www.fiddler2.com/fiddler/help/httpsdecryption.asp

所以你必须在 fiddler 中启用 SSL 选项,然后重新检查它。如果不起作用,请尝试向 fiddler 提供手动 MITM 证书。

于 2013-01-31T01:27:59.750 回答