.NET 4.6.1下的最小,可复制的工作示例
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
WebRequest.Create("https://ir.netflix.com/").GetResponse();
产生以下WebException,
请求已中止:无法创建SSL / TLS安全通道。
只是自己访问该页面,运行openssl s_client -connect ir.netflix.com:443 -tls1_2
或查看SSL Labs analysis summary表明该服务器正在运行正确的TLS 1.2。 HttpWebRequest似乎确实在某些时候适用于TLS 1.2(如建议here),
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
WebRequest.Create("https://www.ssllabs.com:10303").GetResponse();
使用ServerCertificateValidationCallback
(请求对象的全局或本地)禁用证书验证永远不会调用回调;我想它永远不会达到这个目的,
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback =
(sender, cert, chain, sslPolicyErrors) => true;
HttpWebRequest request = WebRequest.Create("https://ir.netflix.com/") as HttpWebRequest;
request.ServerCertificateValidationCallback =
(sender, cert, chain, sslPolicyErrors) => true;
request.GetResponse();
更新:越过Wireshark dumps建议使用常见的签名哈希算法(带RSA的SHA256,带RSA的SHA1)和公共密码套件TLS_RSA_WITH_3DES_EDE_CBC_SHA
(0x000a)。除了最初的两个" Client Hello"和"服务器Hello,证书,服务器Hello Done"数据包,不再与客户联系。
问题:导致此失败的原因是什么?有没有办法访问HttpWebRequest对象的更多调试信息?
(像这样禁用TLS 1.2,
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11;
WebRequest.Create("https://ir.netflix.com/").GetResponse();
有效,但不是最理想的,因为它会全局禁用TLS 1.2。似乎不是一个只为单个HttpWebRequest禁用TLS 1.2的设置。)