【发布时间】:2011-06-03 21:12:19
【问题描述】:
我正在使用 C#(.Net 框架 3.5)应用程序中的 SSL POST 调用来开发登录/注销功能。通过 HttpWebRequest::BeginGetResponse() 从服务器获取响应在 80% 的情况下有效,但另外 20% 的时间是间歇性抛出:
The request was aborted: Could not create SSL/TLS secure channel.
我使用另一个问题中的 suggested 文章启用了 SSL 跟踪。这在请求跟踪中产生了两种不同的模式。
好像在执行过程中报错:
System.Net Error: 0 : [3680] Decrypt returned SEC_I_RENEGOTIATE.
正在接收,导致重新初始化安全上下文。当这种情况发生并且成功时,输出如下(注意我省略了实际地址):
System.Net Error: 0 : [3680] Decrypt returned SEC_I_RENEGOTIATE.
System.Net Information: 0 : [3680] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [3680] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=78, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=1259, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK).
System.Net Information: 0 : [7148] Remote certificate: [Version]
V1
失败时:
System.Net Error: 0 : [3680] Decrypt returned SEC_I_RENEGOTIATE.
System.Net Information: 0 : [3680] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0ab50, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [3680] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=78, returned code=ContinueNeeded).
System.Net Error: 0 : [3680] Exception in the HttpWebRequest#20730349:: - The request was aborted: Could not create SSL/TLS secure channel.
System.Net Verbose: 0 : [3680] HttpWebRequest#20730349::EndGetResponse()
System.Net Error: 0 : [3680] Exception in the HttpWebRequest#20730349::EndGetResponse - The request was aborted: Could not create SSL/TLS secure channel.
我当然可以捕捉到这个异常,但正确的处理方式是什么?
我的应用程序有办法防止(或正确处理)这些错误吗?当它发生时,它似乎在一段时间内不断出错,但在一些未确定数量的请求后又开始工作。
谢谢!
【问题讨论】:
-
您正在访问什么样的服务器?看起来 .NEt 曾尝试重新协商,但服务器不接受握手。
-
一个 Apache Web 服务器。我无法直接访问它。这是标题:{ Content-Length: 225 Content-Type: text/html Date: Fri, 03 Jun 2011 20:05:26 GMT 服务器:Apache X-Powered-By: PHP/5.2.8-pl2-gentoo } .
-
我遇到了完全相同的问题。我还注意到 keep-alive 在 HTTPS 中不起作用,尽管 HttpWebRequest 配置了 keep-alive 并且它在 http 中完美运行。我已经测试过 ServicePointManager.SecurityProtocol SSL3 和 TLS。
-
我添加了一大笔赏金以获得不同的答案。
Expect100Continue = true对我不起作用,我真的需要解决这个问题,这是我们的网络应用程序遇到的最大问题。我得到完全相同的Decrypt returned SEC_I_RENEGOTIATE错误,并且症状与上述相同“似乎有一段时间不断出错,但随后又开始工作”。这是在 IIS 7.5 64 位 Web 服务器上,每天有几百个用户,错误每天发生 1 到 3 次。 -
您访问 Apache 日志吗?此外,Apache 是集群/负载平衡的还是单台服务器? .NET 客户端的同样问题,无论您是从一台服务器还是从集群客户端访问此 Apache 服务器
标签: c# ssl error-handling httpwebrequest