HttpWebRequest vs Fiddler using SSL

本文关键字:SSL using Fiddler vs HttpWebRequest | 更新日期: 2023-09-27 18:17:06

我有一个web应用程序使用HttpWebRequest发送一些数据到第三方服务。它是失败的,当我通过web代码运行它,但当我发送几乎完全相同的数据使用小提琴手的作曲家它的作品。

我说"几乎"是因为数据包含密码摘要、nonce和时间戳,每条消息都会更改。我已经设置了一个断点,并将web应用程序即将发送的数据粘贴到Fiddler中,它可以工作。

我已经设置了我的代码通过Fiddler的代理运行,这是伟大的-我可以看到"原始"数据被发送-它仍然失败,但它使我能够检查头都是完全相同的,混乱与他们一点(没有发现任何有用的)。

    WebProxy myproxy = new WebProxy("127.0.0.1:8889", false);
    req.Proxy = myproxy;

我已经禁用了Fiddler的"自动认证"answers"跟随重定向"选项(已经留下了"fix content-length header"),以防其中一个导致Fiddler行为智能。

这篇文章是一个https URL,所以我必须添加以下行来忽略Fiddler的证书问题时解密https流量

    ServicePointManager
        .ServerCertificateValidationCallback +=
        (sender, cert, chain, sslPolicyErrors) => true;

有人知道HttpWebRequest上的任何选项,我应该启用或禁用,使其作为提琴手吗?由于实际内容似乎相同,可能在安全性/身份验证选项上存在差异?

更改Fiddler的"解密HTTPS"设置似乎没有影响任何东西,除了意味着我无法查看数据。

会使用HttpWebRequest以外的东西是一个选项吗?还有哪些库不只是在底层使用HttpWebRequest ?我不需要异步,但HttpClient使用一个较新的库,处理事情更好吗?

我看过其他关于连接和使HttpWebRequest更高效的帖子,但目前我只是发布一条消息。

如果有帮助的话,下面是标题的样子:

POST https://www.server.com/enterprise/soap?ServiceName=PassportService&auth=1 HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: http://www.server.com/ws/passport/2008/04/PassportService#publishDocumentWithParameters
Host: vha.server.com
Content-Length: 4601
Expect: 100-continue
Connection: Keep-Alive

消息体只是SOAP xml

下面是一些实现。net网络跟踪的数据

System.Net Information: 0 : [8864] ConnectStream#7307007 - Sending headers
{
Content-Type: text/xml; charset=utf-8
SOAPAction: http://www.server.com/ws/passport/2008/04/PassportService#publishDocumentWithParameters
Host: vha.server.com
Content-Length: 4393
Expect: 100-continue
Connection: Keep-Alive
}.
System.Net Information: 0 : [8864] SecureChannel#63848051::.ctor(hostname=vha.server.com, #clientCertificates=0, encryptionPolicy=RequireEncryption)
System.Net Information: 0 : [8864] Enumerating security packages:
System.Net Information: 0 : [8864]     Negotiate
System.Net Information: 0 : [8864]     NegoExtender
System.Net Information: 0 : [8864]     Kerberos
System.Net Information: 0 : [8864]     NTLM
System.Net Information: 0 : [8864]     Schannel
System.Net Information: 0 : [8864]     Microsoft Unified Security Protocol Provider
System.Net Information: 0 : [8864]     WDigest
System.Net Information: 0 : [8864]     TSSSP
System.Net Information: 0 : [8864]     pku2u
System.Net Information: 0 : [8864]     CREDSSP
System.Net Information: 0 : [8864] SecureChannel#63848051 - Left with 0 client certificates to choose from.
System.Net Information: 0 : [8864] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent  = Outbound, scc     = System.Net.SecureCredential)
System.Net Information: 0 : [8864] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = vha.server.com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [8864] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=112, returned code=ContinueNeeded).
System.Net.Sockets Verbose: 0 : [8864] Socket#55285825::Send()

…然后有一些证书来回…

System.Net Information: 0 : [8864] SecureChannel#63848051 - Remote certificate was verified as valid by the user.
System.Net Information: 0 : [8864] ProcessAuthentication(Protocol=Tls, Cipher=Rc4 128 bit strength, Hash=Md5 128 bit strength, Key Exchange=RsaKeyX 2048 bit strength).
System.Net.Sockets Verbose: 0 : [8864] Socket#55285825::Send()

…然后是更多的东西…

System.Net Verbose: 0 : [8864] Exiting HttpWebRequest#49916336::GetRequestStream()  -> ConnectStream#7307007
System.Net Verbose: 0 : [8864] ConnectStream#7307007::Write()
System.Net Verbose: 0 : [8864] Data from ConnectStream#7307007::Write
System.Net Verbose: 0 : [8864] 00000000 : 3C 73 6F 61 70 65 6E 76-3A 45 6E 76 65 6C 6F 70 : <soapenv:Envelop

…更多的SOAP数据紧随其后(看起来像是加密的版本……... 加密的回复返回,然后它被解密…

System.Net Information: 0 : [8864] Connection#4562529 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized.
System.Net Information: 0 : [8864] Connection#4562529 - Received headers
{
Vary: Accept-Encoding
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Length: 666
Content-Type: text/xml;charset=UTF-8
Date: Thu, 07 Aug 2014 06:21:40 GMT
Server: XXXX Web Server 8
}.
System.Net Information: 0 : [8864] ConnectStream#27021036::ConnectStream(Buffered 666 bytes.)
System.Net Information: 0 : [8864] Associating HttpWebRequest#49916336 with ConnectStream#27021036
System.Net Information: 0 : [8864] Associating HttpWebRequest#49916336 with HttpWebResponse#16709290

…使用一些带有错误信息的XML(第三方似乎无法使用这些信息来查明问题)

HttpWebRequest vs Fiddler using SSL

简短的回答是没有区别。

感谢@EricLaw的帮助,我能够排除他能想到的任何其他变量。

问题是密码摘要中的时间戳。我的机器时间有点偏差,他们的也有偏差(但方向相反)。所以结果是,当我将数据粘贴到Fiddler时,它工作了,因为我延迟了一点(但不是太多)。对于这些请求有一个37秒的窗口,当它从代码中运行时,它看起来像是从未来到他们的服务器的时间。

当只有一个变量时,这可能就是问题所在!

谢谢你的耐心和帮助Eric。