详解.NET Core 使用HttpClient SSL请求出错的解决办法

 更新时间:2019-04-17 21:43:06   作者:佚名   我要评论(0)

问题
使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certification authority 异常,并且证书已经传入。

问题

使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certification authority 异常,并且证书已经传入。

下面就是问题代码:

public class Program
{
 public static void Main(string[] args)
 {
  var url = @"https://xxx.xxx.xxx.xxx:xxxx/xxx-web/services/xxxx?wsdl";

  var handler = new HttpClientHandler
  {
   ClientCertificateOptions = ClientCertificateOption.Manual,
   ClientCertificates =
   {
    new X509Certificate2(@"E:\cert\rootTrust.cer","11111111"),
    new X509Certificate2(@"E:\cert\middleTrust.cer","11111111"),
    new X509Certificate2(@"E:\cert\wskey.pfx","ws654321")
   }
  };
  
  var webRequest = new HttpClient(handler);
  var result = webRequest.GetStringAsync(url).GetAwaiter().GetResult();
  Console.WriteLine(result);
 }
}

原因

因为在发出 HTTPS 请求的时候,HttpClient 都会检查 SSL 证书是否合法。如果不合法的话,就会导致抛出异常信息,而对方给出的证书是自签发的测试接口的证书,所以不是一个合法的 SSL 证书。

解决

HttpClientHandler 当中会有一个 ServerCertificateCustomValidationCallback 事件,该事件用于判定证书验证是否通过。我们可以挂接该事件,然后逻辑编写为直接返回 true 结果,这样就会忽略掉证书异常的情况。

最新的代码如下:

public class Program
{
 public static void Main(string[] args)
 {
  var url = @"https://xxx.xxx.xxx.xxx:xxxx/xxx-web/services/xxxx?wsdl";

  var handler = new HttpClientHandler
  {
   ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) => true, 
   ClientCertificateOptions = ClientCertificateOption.Manual,
   ClientCertificates =
   {
    new X509Certificate2(@"E:\cert\rootTrust.cer","11111111"),
    new X509Certificate2(@"E:\cert\middleTrust.cer","11111111"),
    new X509Certificate2(@"E:\cert\wskey.pfx","ws654321")
   }
  };
  
  var webRequest = new HttpClient(handler);
  var result = webRequest.GetStringAsync(url).GetAwaiter().GetResult();
  Console.WriteLine("xx");
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • Asp.Net Core2.1前后使用HttpClient的两种方式
  • ASP.NET Core针对一个使用HttpClient对象的类编写单元测试详解
  • .NET Core中HttpClient的正确打开方式
  • .NET Core中使用HttpClient的正确姿势
  • .NET Core 2.1中HttpClientFactory的最佳实践记录

相关文章

  • PHP lcfirst()函数定义与用法

    PHP lcfirst()函数定义与用法

    PHP lcfirst() 函数 实例 把 "Hello" 的首字符转换为小写。: <&#63;php echo lcfirst("Hello world!"); &#63;> 定义和用法 lcfirst()函数把字符串中的首
    2019-04-17
  • 详解.NET Core 使用HttpClient SSL请求出错的解决办法

    详解.NET Core 使用HttpClient SSL请求出错的解决办法

    问题 使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certification authority 异常,并且证书已经传入。
    2019-04-17
  • jsp实现局部刷新页面、异步加载页面的方法

    jsp实现局部刷新页面、异步加载页面的方法

    局部刷新页面、异步加载页面方案: 1.在jsp页面需要刷新的地方增加一个控件 <div id=courseList></div> 2.新建一个jsp页面:aaa.jsp(用来放置需要刷新的内
    2019-04-17
  • jsp 使用request为页面添加静态数据的实例

    jsp 使用request为页面添加静态数据的实例

    一,在div中插入要显示的数据! 1,以下是原网页插入数据代码: <div> <ul class="list-content"> <li><a href="">aaaaaaaaaaaaaaaaaaa</a><span>[06-29]<
    2019-04-17
  • 使用IDEA编写jsp时EL表达式不起作用的问题及解决方法

    使用IDEA编写jsp时EL表达式不起作用的问题及解决方法

    在使用IDEA开发maven+springMVC项目时遇到不加载EL表达式的问题,怎么处理呢?下面小编给大家带来了实现代码,一起看看吧 加载如下JSP代码: <%@ page cont
    2019-04-17
  • Python正则表达式中的re.S的作用详解

    Python正则表达式中的re.S的作用详解

    Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块,它提供 P
    2019-04-17
  • asp.net上传Excel文件并读取数据的实现方法

    asp.net上传Excel文件并读取数据的实现方法

    前言 本文主要给大家介绍了关于asp.net上传Excel文件并读取数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 实现如下: 前
    2019-04-17
  • PHP join()函数用法与实例讲解

    PHP join()函数用法与实例讲解

    PHP join() 函数 实例 把数组元素组合为一个字符串: <&#63;php $arr = array('Hello','World!','Beautiful','Day!'); echo join(" ",$arr); &#63;> 定
    2019-04-17
  • 浅谈PHP各环境下的伪静态配置

    浅谈PHP各环境下的伪静态配置

    一、Apache的伪静态配置 1、网站根目录下需要有 .htaccess 文件,没有则自己创建一个,内容 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQ
    2019-04-17
  • 谈谈正则表达式中的句号.

    谈谈正则表达式中的句号.

    我们知道,正则表达式中,可以用 . 表示任意单个字符,但在underscore和jquery的源代码中,我们可以看到,这些著名类库的代码中,经常并不是用 . 来表示任意字
    2019-04-17

最新评论