我维护了一个非常复杂的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协议的方法.
我正在考虑以下解决方案:
注意:排队不会是一个巨大的性能损失,因为所有客户端请求的一小部分实际上到达了相关代码.
然而,考虑到应用程序架构或粗略的解决方法(第三种解决方案),上述解决方案需要进行困难的重构
我的问题与msdn上的这个问题非常类似,但是没有得到满意的答案.
是否有更直接或有效的方法来确保每个https请求使用特定的SSL协议?