验证设备的自签名证书

Posted

技术标签:

【中文标题】验证设备的自签名证书【英文标题】:Validate device's self signed certificate 【发布时间】:2019-07-26 12:13:31 【问题描述】:

场景是:我们有一个带有证书的 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;,但我们希望进行适当的证书处理。

【问题讨论】:

你能告诉我们当你不设置ServerCertificateValidationCallback 时会发生什么吗?你想验证什么?到期,它没有被撤销(证书撤销列表或在线响应者)?发行人? 您的信任链由设备证书、颁发该证书的中间 CA 和颁发中间证书的根 CA 组成。您的工作站只知道信任根 CA,并且大概您的 linux 设备在响应 HTTPS 请求时只提供设备证书。因此,显然缺少一块,客户端工作站无法建立信任链。您的 linux 设备应(至少)提供中间证书及其设备特定证书(如果不是完整链)。 @AmitKumarGupta 感谢您的分析。基于它,我们试图查看 Linux 设备(服务器)是否确实只提供叶子而不提供中间证书。在服务器回调中,我们只看到叶子。然而,当我们对 Java 应用程序进行相同尝试时——进行比较——我们确实收到了叶子和中间的组合。因此,在这种情况下,linux 设备的行为与预期的一样,提供了链。这可能是在客户端中以某种方式控制的吗?您是否知道 .NET 端有一个设置来“控制”服务器对证书的响应? 【参考方案1】:

感谢 cmets。在花了一些时间试图弄清楚如何处理来自HttpWebRequestServerCertificateValidationCallback 之后,我决定改变方法并尝试不同的http .net 实现。我使用System.Net.Http.HttpClient 类进行了测试,回调返回了正确验证的完整证书链。此外,ms docs 建议不要使用HttpWebRequest 进行新开发。使用示例:

HttpClientHandler httpClientHandler = new HttpClientHandler();
httpClientHandler.CertificateCustomValidationCallback = ValidationCallback;
using (HttpClient client = new HttpClient(httpClientHandler))


【讨论】:

【参考方案2】:

经过一些测试,我们发现问题出在 .net core 2.0 的 HttpWebRequest 和 HttpClient 上。将框架更新为 .net core 2.1 验证对两者都正常工作。问题在于 .net core 2.0 如何处理证书验证回调。由于 HttpClient 问题没有解决,而是因为我们将版本更新到 2.1。此外,验证回调使用 .net 框架 4.6.1 很好地检索证书链

【讨论】:

以上是关于验证设备的自签名证书的主要内容,如果未能解决你的问题,请参考以下文章

Openssl:错误“证书链中的自签名证书”

使用 SAML 2.0 的自签名证书

Tomcat 服务器和 HTTP 客户端接受过期的自签名证书

SSLHandshake 使用自签名根证书失败 (-9808)

MAC申请自签名的ssl证书

信任来自 IIS 的自签名证书