我们有一个 .Net 4 应用程序,它向运行 Lotus-Domino 的第三方服务器发出 https 请求。我们正在使用 System.Net.WebRequest 发出请求。当 ServicePointManager.SecurityProtocol 设置为默认值时,即 Tls | ssl3,则请求失败。具体来说,WebRequest.GetResponse 会引发异常:WebException:“请求被中止:无法创建 SSL/TLS 安全通道。”
代码很简单:
WebRequest request = WebRequest.Create("https://SOMEURLHERE");
using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
{
using (StreamReader responseReader = new StreamReader(response.GetResponseStream()))
{
string responseTest = responseReader.ReadToEnd();
}
}
将 ServicePointManager.SecurityProtocol 更改为 Ssl3 允许请求成功。将其用作修复会带来一些挑战。ServicePointManager.SecurityProtocol 是静态的,因此更改它将更改应用程序中的所有请求。这是我们不想做的事情。更改它然后在请求后将其重置为默认值是不可取的,因为我们的应用程序从多个线程发出 http 请求,引入锁将有效地迫使我们在可能很长的 Web 服务调用期间运行单线程。
第三方 Lotus-Domino 服务器不支持 TLS。
我查看了 Wireshark 中的请求/响应,但是我不熟悉协议,因此对我来说看不到任何有意义的东西。
不验证证书并不能解决问题,例如 ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
我确实看到了来自服务器的响应:“SSLv3 Record Layer: Alert (Level: Fatal, Description: Close Notify)”
- 有没有一种方法可以为单个请求将 SecurityProtocol 设置为 Ssl3?
- 当 SecurityProtocol = Tls | 时我们还能做些什么吗?ssl3 允许请求工作吗?
- 有什么我可以告诉我们的第三方,运行 Lotus-Domino 服务器来解决他们这边的连接问题。