.net core下用HttpClient和asp.net core实现https的双向认证

原文:.net core下用HttpClient和asp.net core实现https的双向认证

关于https双向认证的知识可先行google,这时矸接代码。

为了双向认证,我们首先得准备两个crt证书,一个是client.crt,一个是server.crt,有时为了验证是否同一个根证书的验证,这两个证书可以共有一个根证书root.crt。

首先要生成这些证书,这里采用了自签证书方式:

证书生成工具可在这里下载(windows下生成):

https://github.com/axzxs2001/Asp.NetCoreExperiment/blob/master/Asp.NetCoreExperiment/Certificate/openssl/Win64OpenSSL-1_1_0i.exe

安装完成后在C:\OpenSSL-Win64\bin(最好不要改路径,否则生成证书时要改配置文件路径)下以管理员运行openssl.exe

一、创建根证书

  • 生成key文件,输入密码:

  openssl genrsa -des3 -out root.key

  • 生成请求证书文件,如果安装路径发生改变,可以通过在下面命令后面添加-config openssl.cfg来指明配置文件路径

  openssl req -new -key root.key -out root.csr

  • 生成一个10年期根证书 root.crt:

  openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey root.key -in root.csr -out root.crt

  分别在客户端或服务端安装根证书,windows上安装证书时,证书存储可选择“受信任的根证书颁发机构”

 

二、创建服务端证书

  • 生成key文件,输入密码

  openssl genrsa -des3 -out server.key 2048

  • 生成请求证书文件,如果安装路径发生改变

  openssl req -new -key server.key -out server.csr

  • 用根证书生成一个10年期证书 server.crt:

  openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA root.crt -CAkey root.key -CAserial root.srl -CAcreateserial -in server.csr -out server.crt

  • 生成.net core识别的证书文件server.pfx

  openssl pkcs12 -export -in server.crt -inkey server.key -out server.pfx

三、创建客户端证书

  • 生成key文件,输入密码

  openssl genrsa -des3 -out client.key 2048

  • 生成请求证书文件,如果安装路径发生改变

  openssl req -new -key client.key -out client.csr

  • 用根证书生成一个10年期证书 client.crt:

  openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA root.crt -CAkey root.key -CAserial root.srl -CAcreateserial -in client.csr -out client.crt

  • 生成.net core识别的证书文件client.pfx

  openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx

接下来创建asp.net core web api项目,并把server.pfx添加到项目中,并设置属性为“始终复制”,接着修改Program.cs下的CreateWebHostBuilder方法就可以:

 1   public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
 2             WebHost.CreateDefaultBuilder(args)
 3                 .UseKestrel(options =>
 4                 {
 5                     options.Listen(IPAddress.Any, 80);
 6                     //启用https,443端口
 7                     options.Listen(IPAddress.Any, 443, listenOptions =>
 8                     {
 9                         var serverCertificate = new X509Certificate2("server.pfx", "ssssss");
10                         var httpsConnectionAdapterOptions = new HttpsConnectionAdapterOptions()
11                         {
12                             ClientCertificateMode = ClientCertificateMode.AllowCertificate,
13                             SslProtocols = System.Security.Authentication.SslProtocols.Tls12,
14                             //用chain.Build验证客户端证书
15                             ClientCertificateValidation = (cer, chain, error) =>
16                              {
17                                  return chain.Build(cer);
18                              },
19                             ServerCertificate = signingCertificate
20                         };
21                         listenOptions.UseHttps(httpsConnectionAdapterOptions);
22                     });
23                 })
24                 .UseStartup<Startup>();

为了区分http和https请求,在HomeController中写如下代码:

 1         [HttpGet]
 2         public ActionResult<IEnumerable<string>> Get()
 3         {
 4             var cer = HttpContext.Connection.ClientCertificate;
 5             //证书为空,返回BadRequest
 6             if (cer == null)
 7             {
 8                 return BadRequest();
 9             }
10             else
11             {
12                 return new string[] { "value1", "value2" };
13             }
14         }

创建客户应用,.net core的控制台项目,把client.pfx添加到项目中,并设置属性为“始终复制”,然后代码如下

 1         static void Main(string[] args)
 2         {
 3             Console.WriteLine("enter start");
 4             while (true)
 5             {
 6                 try
 7                 {
 8                     Console.WriteLine("1、Https   2、Http");
 9                     switch (Console.ReadLine())
10                     {
11                         case "1":
12                             HttpsMethod();
13                             break;
14                         case "2":
15                             HttpMethod();
16                             break;
17                     }
18                     void HttpsMethod()
19                     {
20                         var handler = new HttpClientHandler();
21                         handler.ClientCertificateOptions = ClientCertificateOption.Manual;
22                         handler.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls | SslProtocols.None | SslProtocols.Tls11;
23                         try
24                         {
25                            //加载客户端证书
26                             var crt = new X509Certificate2(Directory.GetCurrentDirectory() + "/client.pfx", "cccccc");
27                             handler.ClientCertificates.Add(crt);
28                         }
29                         catch (Exception e)
30                         {
31                             Console.WriteLine(e.Message);
32                         }
33                         //用chain.Build验证服务器证书
34                         handler.ServerCertificateCustomValidationCallback = (message, cer, chain, errors) =>
35                         {
36                             return  chain.Build(cer);
37                         };
38                         var client = new HttpClient(handler);
39                         var url = "https://192.168.252.41 /api/values";
40                         var response = client.GetAsync(url).Result;
41                         Console.WriteLine(response.IsSuccessStatusCode);
42                         var back = response.Content.ReadAsStringAsync().Result;
43                         Console.WriteLine(back);
44                     }
45                     void HttpMethod()
46                     {
47                         var client = new HttpClient();
48                         var url = "http://192.168.252.41/api/values";
49                         var response = client.GetAsync(url).Result;
50                         Console.WriteLine(response.IsSuccessStatusCode);
51                         var back = response.Content.ReadAsStringAsync().Result;
52                         Console.WriteLine(back);
53                     }
54                 }
55                 catch (Exception exc)
56                 {
57                     Console.WriteLine(exc.InnerException?.InnerException?.Message);
58                 }
59             }
60         }

结果如下图:

代码:https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/Certificate

原文地址:https://www.cnblogs.com/lonelyxmas/p/10516060.html

时间: 2024-11-05 17:31:28

.net core下用HttpClient和asp.net core实现https的双向认证的相关文章

ubuntu16.4下用jexus部署asp.net core rtm

上篇文章介绍了下用vs发布部署到iis环境,今天说下ubuntu 下部署asp.net core,不需要安装.net core sdk,自带运行时方式部署,利用jexus服务器转发请求到asp.net core. 1.部署准备环境 vmware虚拟机(其他也可以) ubuntu16.04镜像 2.发布环境 win10系统 vs2015 update3 或vs code (也可以用dotnet new -t web 命令创建项目) dotnet sdk  DotNetCore.1.0.0-SDK.

在Linux环境下使用Jexus部署ASP.NET Core

关于如何在Linux中添加ASP.NET Core运行时环境请参考我的上一篇文章,本文章将不再做赘述. 本文章运行环境如下:  (1) 安装独立版Jexus 本教程安装的是独立版的Jexus,独立版的Jexus自带Mono,使用的是Mono的稳定版本4.8.安装 Jexus 直接使用一下命令即可(需要在root身份下执行): curl https://jexus.org/release/x64/install.sh|sh 安装成功后会提示:OK, Jexus has been installed

学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面

学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目基本页面 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面 上一篇文章中我们学习了列表页面的结构,@page与@model两个关键Razor指令,以及页面布局应该修改哪里.这一篇文章我们来

ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 设置和初始化数据库 上一章节中我们已经设置和配置好了 EF 框架服务,本章节我们就来学习如何使用 EF 框架设置和初始化数据库 初始化数据库 初始化数据库的方法之一是使用 EF 框架来创建数据库,仅仅需要两步就能完成 第一步,给我们的 HelloWorld 项目添加迁移 ( migration ) 代码 迁移代码是 C# 代码,用来在数据库系统中创建数据库

ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF SQLite 支持 上一章节我有提到 macOS 版的 Visual Studio Community 没有携带 LocalDB,也就是说 LocalDB 暂时不支持 macOS 系统 虽然我可以在 Windows 上继续完成接下来的教程,但我觉得还是感觉不妥,如果其它使用苹果笔记本的人要去哪里找 Windows 的电脑 我临时改变

ASP.NET Core 入门教程 7、ASP.NET Core MVC 分部视图入门

原文:ASP.NET Core 入门教程 7.ASP.NET Core MVC 分部视图入门 一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Razor)强类型分部视图教程 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SDK 2.1.401 ASP.NET Core 2.1.3 IDE Visual Studio Code 1

ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门

原文:ASP.NET Core 入门教程 5.ASP.NET Core MVC 视图传值入门 一.前言 1.本教程主要内容 ASP.NET Core MVC 视图引擎(Razor)简介 ASP.NET Core MVC 视图(Razor)ViewData使用示例 ASP.NET Core MVC 视图(Razor)ViewBag使用示例 ASP.NET Core NVC 视图(Razor)强类型传值(ViewModel)页示例 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10

ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF 框架服务 上一章节中我们了解了 Entity Framework 的基本工作原理和 DbContext ,我们也创建了一个自己的 HelloWorldDBContext. 本章节我们就来讲讲如何设置我们的 EF 框架来链接到 SQLite 数据库 配置 EF 框架服务 要让我们的 EF 框架的 DBContext 能够运行起来,我们需要更改一

ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门

原文:ASP.NET Core 入门教程 4.ASP.NET Core MVC控制器入门 一.前言 1.本教程主要内容 ASP.NET Core MVC控制器简介 ASP.NET Core MVC控制器操作简介 ASP.NET Core MVC控制器操作简介返回类型简介 ASP.NET Core MVC控制器操作简介返回类型示例 ASP.NET Core MVC控制器参数映射逻辑说明 ASP.NET Core MVC控制器参数映射/获取示例 2.本教程环境信息 软件/环境 说明 操作系统 Win