我正在尝试使用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中,GET http://localhost:7777/
工作正常,但当我获取https://localhost:7777/
时,firefox会报告错误:
为什么我会这样做,我该如何解决?
更新
只有当我使用fiddler作为firefox的代理时才会发生这种情况。当我删除fiddler代理时,我可以访问https://localhost:7777/
。但是,我还希望能够通过代理
https://localhost:7777/
答案 0 :(得分:1)
HTTPS流量已加密,fiddler作为Web调试器代理无法解密/分析通过fiddler发送的数据包数据。它使用MITM攻击来解密通过fiddler发送的SSL流量,请参见此处: http://www.fiddler2.com/fiddler/help/httpsdecryption.asp
所以你必须在fiddler中启用SSL选项,然后重新检查它。如果它不起作用,请尝试向fiddler提供手动MITM证书。
答案 1 :(得分:1)
此方案中的问题是您要对此流量进行两次处理:
首先,浏览器发送一个CONNECT到端口8888,说:&#34;请给我一个TCP / IP隧道到端口7777&#34;然后在Fiddler说&#34;好的之后,我们会这样做&#34;客户端通过该隧道向端口7777发送HTTPS请求。
这里的问题是你要修改CONNECT响应并返回HTML而不是允许来自端口7777的HTTPS握手流过。
解决此问题的最简单方法是将BeforeRequest代码更改为以下内容:
if ( (oS.hostname == sSecureEndpointHostname) && (oS.port==7777)
&& !oS.HTTPMethodIs("CONNECT")) {
执行此操作后,您的CONNECT隧道将不再受到损坏,HTTPS握手将成功。