我正在处理一个项目,其中涉及两个后端服务器之间的一些HTTP通信。这两个服务器都使用X509证书进行身份验证。需要注意的是,当服务器A(客户端)连接到服务器B(服务器)时,会出现SSL / TLS验证错误,因为使用的证书不是来自受信任的第三方机构。
通常的处理方法是使用ServicePointManager.ServerCertificateValidationCallback
,例如:
ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, error) =>
{
return cert.GetCertHashString() == "xxxxxxxxxxxxxxxx";
};
这种方法虽然可行,但并不理想。它的本质是覆盖了应用程序所做的每个HTTP请求的验证过程。因此,如果另一个类尝试运行HTTP请求,它将失败。此外,如果另一个类为其自己的目的覆盖了ServicePointManager.ServerCertificateValidationCallback
,那么我的通信会突然失败。
唯一想到的解决方案是创建一个单独的AppDomain 来执行客户端HTTP请求。这样做是可行的,但只为了执行HTTP请求而这样做实在是愚蠢的。开销将是巨大的。
考虑到这一点,有没有人研究过在.NET中是否有更好的实践方式,可以在处理客户端SSL/TLS验证时,不影响其他Web客户端的访问Web服务?
HttpClient
而不是HttpWebRequest
的人,需要注意的是,ServerCertificateValidationCallback
属性位于你传入HttpClient
构造函数的WebRequestHandler
对象上。这个对象已经被用来设置客户端证书,所以这是一个简单的补充。 - Granger