我尝试使用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位于我所有二进制文件所在的文件夹中。
答案 0 :(得分:2)
问题是HTTPS流量通过CONNECT隧道流动,默认情况下,如果创建到目标服务器的CONNECT隧道首先没有成功,则不会发送安全流量。当然,如果该目标服务器不存在,则在创建隧道时最终会出现DNS错误,因此永远不会发送安全请求。
解决方法是告诉Fiddler告诉客户端CONNECT隧道是否已创建,甚至没有尝试联系服务器。通过在BeforeRequest
处理程序中添加它来执行此操作:
if (oSession.HTTPMethodIs("CONNECT"))
{
oSession.oFlags["x-replywithtunnel"] = "GenerateTunnel";
return;
}