相关疑难解决方法(0)

请求已中止:无法创建SSL/TLS安全通道

WebRequest由于此错误消息,我们无法连接到HTTPS服务器:

The request was aborted: Could not create SSL/TLS secure channel.

我们知道服务器没有使用路径的有效HTTPS证书,但是为了绕过这个问题,我们使用以下代码,我们从另一个StackOverflow帖子中获取:

private void Somewhere() {
    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}

private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
   return true;
}
Run Code Online (Sandbox Code Playgroud)

问题是服务器永远不会验证证书并因上述错误而失败.有谁知道我该怎么办?


我应该提到一位同事和我几周前进行了测试,并且它与我上面写的内容类似.我们发现的唯一"主要差异"是我使用的是Windows 7并且他使用的是Windows XP.这有什么改变吗?

c# asp.net httpwebrequest windows-7 windows-8

349
推荐指数
29
解决办法
63万
查看次数

尽管设置了ServerCertificateValidationCallback,但无法创建SSL/TLS安全通道

我正在尝试使用自签名证书建立与测试服务器的 SSL/TLS连接.通过不安全的渠道进行沟通没有问题.

这是我的示例代码,我是基于这个解决方案编写的: 使用HttpClient C 允许不受信任的SSL证书#忽略证书错误?.NET客户端连接到ssl Web API

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

var c = new HttpClient();
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result;
if (r.IsSuccessStatusCode)
{
    Log.AddMessage(r.Content.Get<string>());
}
else
{
    Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase));
}
Run Code Online (Sandbox Code Playgroud)

还试过这个:

var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...
Run Code Online (Sandbox Code Playgroud)

还有这个

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
Run Code Online (Sandbox Code Playgroud)

但每次我都有例外:

InnerException: System.Net.Http.HttpRequestException
   _HResult=-2146233088
   _message=An error occurred while sending the request. …
Run Code Online (Sandbox Code Playgroud)

c# ssl https

64
推荐指数
5
解决办法
10万
查看次数

.NET https跨线程使用不同安全协议的请求

我维护了一个非常复杂的ASP.NET应用程序(一个定制的NopCommerce 3.10).它需要在不同的场景下通过HTTPS连接到第三方服务器.我是在HttpWebRequest课堂上这样做的.

其中一些服务器配置不当:

其中一个第三方服务器(例如服务器A)需要SSL3协议类型,如果设置了其他协议类型,则只会使连接失败.如果使用SSL3执行连接,则另一台服务器(例如服务器B)提供不正确的证书.更确切地说,它提供了具有错误CN(通用名称)的证书.但是,如果我从一开始就使用TLS,证书就可以了.

我使用ServicePointManager.ServerCertificateValidationCallback回调确定了上述问题,以检查SSL策略错误.

更改安全协议是通过ServicePointManager.SecurityProtocol完成的,这是一个静态属性.但是,客户端对我的应用程序执行的触发上述HTTPS连接的请求可能碰巧在不同的线程中并行运行.

如果我,例如:将安全协议设置为所需类型,执行HTTPS请求,然后将其设置回服务器A,我无法保证如果同时需要连接到服务器B的请求不会更改ServicePointManager.SecurityProtocol服务器A所需的值以外的值.我相信这是静态变量的典型多线程问题.

根据我的研究,我确定.NET没有为每个WebRequest实例提供使用特定SSL协议的方法.

我正在考虑以下解决方案:

  • 排队应用程序内的所有传出HTTPS连接,以确保每个连接都有正确的SSL协议
  • 为每个HTTPS请求构建单独的应用程序域(由/sf/answers/217538471/建议)
  • 将HTTPS请求更改为低级TCP连接,并为每个TCP连接强制执行不同的SSL协议
  • 制作代理asp.net应用程序,它将对传出请求进行排队

注意:排队不会是一个巨大的性能损失,因为所有客户端请求的一小部分实际上到达了相关代码.

然而,考虑到应用程序架构或粗略的解决方法(第三种解决方案),上述解决方案需要进行困难的重构

我的问题与msdn上的这个问题非常类似,但是没有得到满意的答案.

是否有更直接或有效的方法来确保每个https请求使用特定的SSL协议?

c# asp.net ssl multithreading

18
推荐指数
1
解决办法
6298
查看次数

如何在特定的HttpWebRequest中使用SSL3而不是TLS?

我的应用程序必须通过https与不同的主机通信,默认设置为ServicePointManager.SecurityProtocol = TLS我提供了很好的服务.现在我有一些主机(如System.Net跟踪日志显示)不回答初始TLS握手消息,但保持底层连接打开,直到超时,抛出超时异常.我尝试将HttpWebRequest超时设置为5分钟,结果相同.据推测,这些主机正在等待SSL3握手,因为IE和Firefox都可以在30-40秒的延迟后连接到这些主机.在.NET中似乎有一些回退机制将TLS降级为SSL3,但由于某些原因它没有启动.

FWIW,这是我的请求发送的握手消息(常规TLS 1.0 CLIENT HELLO消息):

00000000 : 16 03 01 00 57 01 00 00-53 03 01 4C 12 39 B4 F9 : ....W...S..L.9..
00000010 : A3 2C 3D EE E1 2A 7A 3E-D2 D6 0D 2E A9 A8 6C 03 : .,=..*z>......l.
00000020 : E7 8F A3 43 0A 73 9C CE-D7 EE CF 00 00 18 00 2F : ...C.s........./
00000030 : 00 35 00 05 00 0A C0 09-C0 …
Run Code Online (Sandbox Code Playgroud)

.net ssl httpwebrequest

11
推荐指数
1
解决办法
2万
查看次数

标签 统计

c# ×3

ssl ×3

asp.net ×2

httpwebrequest ×2

.net ×1

https ×1

multithreading ×1

windows-7 ×1

windows-8 ×1