【问题标题】:How to validate SSL Certificate for Web request using ASP.NET Core如何使用 ASP.NET Core 验证 Web 请求的 SSL 证书
【发布时间】:2017-03-06 05:20:47
【问题描述】:

我已经实现了一种使用 APS.NET 核心 (System.Net.HttpWebRequest) 从 REST API 请求(基于 SSL 的请求:https://)获取响应的方法。

我需要忽略获取WebResponse 时发生的证书错误。我参考了很多博客,得到了使用ServicePointManager 的解决方案,并在下面的代码中使用了这个

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; 

但在 ASP.NET 核心中不支持ServicePointManager。因此,请仅通过HttpWebRequest 而非HttpClient 帮助我解决此问题。

【问题讨论】:

    标签: c# https asp.net-core self-signed system.net.httpwebrequest


    【解决方案1】:

    .NET Core 使您可以覆盖 ServerCertificateCustomValidationCallback 委托。示例:

    var handler = new HttpClientHandler();
    handler.ServerCertificateCustomValidationCallback = delegate { return true; };
    var http = new HttpClient(handler);
    Console.WriteLine(http.GetAsync("https://expired.badssl.com/").GetAwaiter().GetResult());
    

    输出:

    StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
    {
      Server: nginx/1.10.0
      Server: (Ubuntu)
      Date: Mon, 06 Mar 2017 05:56:52 GMT
      Transfer-Encoding: chunked
      Connection: keep-alive
      ETag: W/"58924b62-1d5"
      Cache-Control: no-store
      Content-Type: text/html
      Last-Modified: Wed, 01 Feb 2017 20:56:02 GMT
    }
    

    在带有 .NET 1.0.0-preview2-1-003177 的 Ubuntu 16.04 上测试。有一个与此相关的 open issue 在 MacOS 上也可以正常工作。

    【讨论】:

    • 我已经提到了这个。但我想知道如何为 HttpWebRequest 类实现这一点。例如:code string url="XXXXXXXX:XXXX"; HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.Method = "获取"; httpRequest.ContentType = "应用程序/json";使用 (var result = (HttpWebResponse)(await Task.Factory.FromAsync(httpRequest.BeginGetResponse, httpRequest.EndGetResponse, null))) { StreamReader streamReader = new StreamReader(result.GetResponseStream());响应 = streamReader.ReadToEnd(); }
    • 这看起来在 .NET Core 2.0 (github.com/dotnet/corefx/issues/16181) 中是可能的。
    • HttpWebRequest 在 .net 核心中已被弃用,只是 HttpClient 之上的一个附加层。
    【解决方案2】:

    在调用请求之前:

    ServicePointManager.ServerCertificateValidationCallback = new   
    RemoteCertificateValidationCallback(validarCertificado);
    

    ...并包含此功能:

    protected bool validarCertificado(Object sender,
                                  X509Certificate certificado,
                                  X509Chain cadena,
                                  SslPolicyErrors sslErrores)
    {
       return true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-21
      • 2021-12-02
      • 2021-11-10
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      相关资源
      最近更新 更多