c# - 验证设备的自签名证书
问题描述
场景是:我们有一个带有证书的 linux 设备。设备证书由根证书签名的中间证书签名,因此深度级别为 3。有一个服务可以对 linux 设备进行 Https 调用。该服务托管在 Windows 工作站上,并且在 CA 信任库中安装了对设备进行签名的根证书的公钥。问题是我们无法找到在工作站端验证设备证书的正确方法。
在创建 HttpWebRequest 时,我们尝试通过在 Windows 上的本地用户的受信任根证书颁发机构中添加公共证书来验证证书。
var httpWebRequest = (HttpWebRequest)WebRequest.Create(endpoint);
httpWebRequest.ServerCertificateValidationCallback = CertificateValidationHandler;
处理程序是:
bool CertificateValidationHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
{
return true;
}
//Validate certificate
}
验证的简单方法很简单return true;
,但我们希望有一个适当的证书处理。
解决方案
经过一些测试,我们发现问题出在 .net core 2.0 的 HttpWebRequest 和 HttpClient 上。将框架更新为 .net core 2.1 验证对两者都有效。问题在于 .net core 2.0 如何处理证书验证回调。由于 HttpClient 问题没有解决,而是因为我们将版本更新到 2.1。此外,验证回调使用 .net 框架 4.6.1 很好地检索证书链