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が最大許容長を超えるレコードを受信しました

なぜこれを入手するのですか、どうすれば修正できますか?

更新 これは、Firefoxのプロキシとしてfiddlerを使用した場合にのみ発生します。フィドラープロキシを削除すると、にアクセスできますhttps://localhost:7777/https://localhost:7777/ただし、プロキシ経由でもアクセスできるようにしたいと思います

4

2 に答える 2

1

HTTPSトラフィックは暗号化されており、Webデバッガプロキシはフィドラーを介して送信されるパケットデータを復号化/分析できないため、フィドラーです。MITM攻撃を使用して、フィドラー経由で送信されるSSLトラフィックを復号化し ます。http ://www.fiddler2.com/fiddler/help/httpsdecryption.aspを参照してください。

したがって、フィドラーでSSLオプションを有効にしてから、再確認する必要があります。それが機能しない場合は、手動のMITM証明書をフィドラーに提供してみてください。

于 2013-01-31T01:27:59.750 に答える
1

このシナリオの問題は、このトラフィックを2回処理していることです。

最初に、ブラウザはCONNECTをポート8888に送信し、「ポート7777へのTCP / IPトンネルを教えてください」と言ってから、Fiddlerが「OK、やります」と言った後、クライアントはそのトンネルを介してポートにHTTPS要求を送信します。 7777。

ここでの問題は、ポート7777からのHTTPSハンドシェイクを許可する代わりに、そのCONNECT応答をマングリングしてHTMLを返すことです。

これを修正する最も簡単な方法は、BeforeRequestコードを次のように変更することです。

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

これを行うと、CONNECTトンネルがマングルされなくなり、HTTPSハンドシェイクが成功します。

于 2014-04-03T17:50:29.663 に答える