使用FiddlerCore捕获对不存在的服务器的HTTPS请求

时间:2014-04-14 14:37:48

标签: https fiddler fiddlercore

我尝试使用fiddlercore响应https请求。 我需要这样的工作:我在浏览器中添加一些假网址,例如https://my_url_that_doesnt_exist.com/ 我用fiddlercore拦截了这个请求,并用我的数据来回应它。但我只看到一个CONNECT和主机网址。我知道,它的应用https和fiddler是代理。但有没有办法获得真正的网址,并能够使用fiddler核心响应https请求?

此外,如果缺少根证书,我还会使用此代码创建根证书:

if (!Fiddler.CertMaker.rootCertExists()) { if (!Fiddler.CertMaker.createRootCert()) { throw new Exception("Could not create a certificate."); } }

我也使用这个启动设置:

FiddlerCoreStartupFlags fcsf = FiddlerCoreStartupFlags.Default | FiddlerCoreStartupFlags.DecryptSSL|FiddlerCoreStartupFlags.AllowRemoteClients;

CONFIG.IgnoreServerCertErrors = true;

这个https请求在fiddler本身中不可见。我的意思是,如果我尝试一些不存在的URL,我喜欢我的应用程序,以回应一些自定义内容。它也是HTTP,而不是HTTPS和fiddler本身包含以下响应: [Fiddler] DNS Lookup for "my_url_that_doesnt_exist.com" failed. The requested name is valid, but no data of the requested type was found

但是,如果我使用一些现有的https网址,例如google plus或类似内容,我可以看到https和所有请求详情。

所以问题如下:我如何拦截对非现有网址的https请求并改为提供我的内容? 如果需要,我可以提供任何其他详细信息。

此外,makecert.exe位于我所有二进制文件所在的文件夹中。

1 个答案:

答案 0 :(得分:2)

问题是HTTPS流量通过CONNECT隧道流动,默认情况下,如果创建到目标服务器的CONNECT隧道首先没有成功,则不会发送安全流量。当然,如果该目标服务器不存在,则在创建隧道时最终会出现DNS错误,因此永远不会发送安全请求。

解决方法是告诉Fiddler告诉客户端CONNECT隧道是否已创建,甚至没有尝试联系服务器。通过在BeforeRequest处理程序中添加它来执行此操作:

if (oSession.HTTPMethodIs("CONNECT"))
{
  oSession.oFlags["x-replywithtunnel"] = "GenerateTunnel";
  return;
}