HttpWebrequest失败,内部异常验证失败,因为远程方已关闭传输流

spi*_*r86 24 c# vmware ssl-certificate system.net.webexception vcenter

使用C#,.Net 4.5,我试图通过远程服务器上的HttpWebRequest发送Web请求.请参阅下面的代码.我尝试了一些论坛建议的大多数解决方案,但我总是遇到同样的错误.请参阅下面的堆栈跟踪.调用request.GetReponse()方法时抛出错误.

其他信息,基本上,我正在尝试调用安装在远程服务器上的vmware的vCenter组件的reloadSslCertificate功能.目前,该错误仅发生在vCenter 5.5上.它在5.1及以下版本中工作正常.

        var uri = String.Format("https://{0}/some_url", serverName);
        var request = (HttpWebRequest)WebRequest.Create(uri);
        request.KeepAlive = true;
        request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8");
        request.Credentials = credential;
        request.CookieContainer = cookieContainer;


        var response = request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

异常:System.Net.WebException:基础连接已关闭:发送时发生意外错误.---> System.IO.IOException:身份验证失败,因为远程方已关闭传输流.System.Net.Security.SslState的System.Net.Security.SslState.StartReadFrame(Byte []缓冲区,Int32 readBytes,AsyncProtocolRequest asyncRequest)处于System.Net.Security.SslState的System.Net.Security.SslState.StartReceiveBlob(Byte []缓冲区,AsyncProtocolRequest asyncRequest). System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst,Byte [] buffer,AsyncProtocolRequest)上的System.Net.Security.SslState.StartSendBlob(Byte []传入,Int32计数,AsyncProtocolRequest asyncRequest)中的CheckCompletionBeforeNextReceive(ProtocolToken消息,AsyncProtocolRequest asyncRequest) System.Net.Security.SslState上的asyncRequest).

提前致谢.

spi*_*r86 24

我只想分享一下这个问题已经解决了.

我刚刚在发出Web请求之前修改了我设置安全协议的代码部分.

从:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
Run Code Online (Sandbox Code Playgroud)

至:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls;
Run Code Online (Sandbox Code Playgroud)

事实证明,vCenter 5.5在其配置中使用TLS作为其SSL协议.我希望人们在遇到同样的问题时可能会觉得有用.


neu*_*990 17

我们遇到了同样的例外.在我们的案例中,答案与@Dennis Laping的回答非常相似.另一个团队设置了我们试图在Rancher负载均衡器中命中的服务,默认情况下不允许使用TLS 1.0或SSL3.恰好,.NET中的SecurityProtocol(未设置)的当前默认值仅允许TLS 1.0或SSL3.

一旦我们按如下方式设置SecurityProtocol,一切正常:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

总而言之,SecurityProtocol的文档指出:

您的代码绝不应隐式依赖于使用特定保护级别,或假设默认情况下使用给定的安全级别.如果您的应用程序依赖于特定安全级别的使用,则必须明确指定该级别,然后检查以确保它在已建立的连接上实际使用.此外,面对支持哪些协议的更改,您的代码应设计为健壮的,因为这些更改通常在很少提前通知的情况下进行,以便缓解新出现的威胁.

我们将重新评估我们的协议情况的最佳解决方案,但是现在我希望这可以帮助其他人.

  • +1拯救我的生命.为了使我们的服务在ssllabs上获得A评级,我们严格限制了我们的端点允许的协议 - 打破了我们的客户端应用程序.你的答案是解决它的诀窍!谢谢!! (2认同)