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(第三方似乎无法使用这些信息来查明问题)
简短的回答是没有区别。
感谢@EricLaw的帮助,我能够排除他能想到的任何其他变量。
问题是密码摘要中的时间戳。我的机器时间有点偏差,他们的也有偏差(但方向相反)。所以结果是,当我将数据粘贴到Fiddler时,它工作了,因为我延迟了一点(但不是太多)。对于这些请求有一个37秒的窗口,当它从代码中运行时,它看起来像是从未来到他们的服务器的时间。
当只有一个变量时,这可能就是问题所在!
谢谢你的耐心和帮助Eric。