ASP.NET Core 2.1 httpClient.GetAsync 报SSL错误的问题

开发者心声 2021-01-22 ⋅ 24 阅读

在使用 ASP.NET Core 2.1 开发应用程序时,经常需要使用 HttpClient 来发送 HTTP 请求。然而,偶尔我们可能会遇到一个问题,即在使用 httpClient.GetAsync 方法发送请求时,会收到一个 SSL 错误。本文将探讨这个问题,并提供解决方案。

问题描述

在使用 httpClient.GetAsync 方法发送 HTTP 请求时,偶尔会遇到一个 SSL 错误,错误信息可能是 "The SSL connection could not be established" 或者 "Could not establish trust relationship for the SSL/TLS secure channel".

问题原因

这个问题通常是由于服务器的 SSL 证书未能通过验证引起的。httpClient.GetAsync 方法会验证服务器的 SSL 证书,如果证书无法通过验证,将会引发 SSL 错误。

解决方案

解决这个问题的方法有多种,我们将讨论两种常见的解决方案。

方法一:忽略 SSL 证书验证

尽管不建议在生产环境中使用该方法,但在调试期间可以忽略 SSL 证书验证。

// 创建一个 HttpClientHandler 实例,并将其 ServerCertificateCustomValidationCallback 属性设置为一个总是返回 true 的回调函数
var handler = new HttpClientHandler
{
    ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};

// 使用这个自定义的 HttpClientHandler 实例来创建 HttpClient 对象
var httpClient = new HttpClient(handler);

// 发送 GET 请求
var response = await httpClient.GetAsync(url);

虽然这种方式可以解决 SSL 错误问题,但是它会使应用程序忽略服务器证书的验证,存在一定的安全风险。

方法二:使用自定义 SSL 证书验证回调函数

这种方法是另一种替代方法,它允许我们自己实现服务器证书的验证逻辑。

// 创建一个 HttpClientHandler 实例,并将其 ServerCertificateCustomValidationCallback 属性设置为一个自定义的回调函数
var handler = new HttpClientHandler
{
    ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) =>
    {
        // 在这里编写自己的证书验证逻辑,比如检查证书的有效性、域名匹配等
        // 如果验证通过,返回 true;否则,返回 false

        return true; // 临时方案,通常需要根据实际情况修改
    }
};

// 使用这个自定义的 HttpClientHandler 实例来创建 HttpClient 对象
var httpClient = new HttpClient(handler);

// 发送 GET 请求
var response = await httpClient.GetAsync(url);

在自定义的回调函数中,我们可以根据实际需求编写自己的证书验证逻辑,例如检查证书的有效性、域名匹配等。需要根据具体情况调整验证逻辑,以确保服务器证书的安全性。

结论

在使用 ASP.NET Core 2.1 开发应用程序时,我们经常会遇到使用 httpClient.GetAsync 方法发送请求时出现 SSL 错误的问题。通过忽略 SSL 证书验证或者使用自定义的验证逻辑,我们可以解决这个问题。但是需要注意,忽略 SSL 证书验证可能会存在安全风险,因此在生产环境中不建议使用。


全部评论: 0

    我有话说: