【问题标题】: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 端有一个设置来“控制”服务器对证书的响应?

标签: c# certificate ssl-certificate self-signed


【解决方案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 很好地检索证书链

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 2015-11-01
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      相关资源
      最近更新 更多