gpt4 book ai didi

c# - HttpWebRequest 与使用 SSL 的 Fiddler

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:05 26 4
gpt4 key购买 nike

我有一个网络应用程序使用 HttpWebRequest 将一些数据发送到第三方服务。当我通过网络代码运行它时它失败了,但是当我使用 Fiddler 的 Composer 发送几乎完全相同的数据时它起作用了。

我说“差不多”是因为数据包含密码摘要和随每条消息而变化的随机数和时间戳。我已经设置了一个断点,并获取了网络应用程序即将发送的数据并将其粘贴到 Fiddler 中,它可以正常工作。

我已经设置我的代码也可以通过 Fiddler 的代理运行,这很棒 - 我可以看到正在发送的“原始”数据 - 它仍然失败,但它使我能够检查 header 是否完全相同并且弄乱他们一点(没有发现任何有用的东西)。

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

我已经禁用了 Fiddler 的“自动验证”和“跟随重定向”选项(保留在“修复内容长度 header ”上),以防其中一个导致 Fiddler 采取聪明的行动。

这篇文章是针对 https URL 的,因此我必须添加以下行以在解密 HTTPS 流量时忽略 Fiddler 的证书问题

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

有谁知道我应该启用或禁用 HttpWebRequest 的任何选项以使其像 Fiddler 一样运行?由于实际内容似乎相同,可能安全/身份验证选项有所不同?

更改 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 Network Tracing 的一些数据

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(第 3 方似乎无法使用它来查明问题...

最佳答案

简短的回答是没有区别。

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

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

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

感谢您的耐心帮助 Eric。

关于c# - HttpWebRequest 与使用 SSL 的 Fiddler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25193976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com