文章来自:https://www.cnblogs.com/axzxs2001/p/10070562.html

关于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.RequireCertificate,
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 }

.net core https 双向验证的更多相关文章

  1. linux:Nginx+https双向验证(数字安全证书)

    本文由邓亚运提供 Nginx+https双向验证 说明: 要想实现nginx的https,nginx必须启用http_ssl模块:在编译时加上--with-http_ssl_module参数就ok.另 ...

  2. nginx配置https双向验证(ca机构证书+自签证书)

    nginx配置https双向验证 服务端验证(ca机构证书) 客户端验证(服务器自签证书) 本文用的阿里云签发的免费证书实验,下载nginx安装ssl,文件夹有两个文件 这两个文件用于做服务器http ...

  3. Java Https双向验证

    CA: Certificate Authority,证书颁发机构 CA证书:证书颁发机构颁发的数字证书 参考资料 CA证书和TLS介绍 HTTPS原理和CA证书申请(满满的干货) 单向 / 双向认证 ...

  4. Https双向验证与Springboot整合测试-人来人往我只认你

    1 简介 不知不觉Https相关的文章已经写了6篇了,本文将是这个专题的最后一篇,起码近期是最后一篇.前面6篇讲的全都是单向的Https验证,本文将重点介绍一下双向验证.有兴趣的同学可以了解一下之前的 ...

  5. ssl/https双向验证的配置

    1.SSL认证 不需要特别配置,相关证书库生成看https认证中的相关部分 2.HTTPS认证 一.基本概念 1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源  2.双向认证,如果客户端 ...

  6. ssl https双向验证的配置与证书库的生成

    1.SSL认证 不须要特别配置,相关证书库生成看https认证中的相关部分 2.HTTPS认证 一.基本概念 1.单向认证,就是传输的数据加密过了,可是不会校验client的来源  2.双向认证,假设 ...

  7. https 双向验证

    服务器配置 服务器秘钥   服务器公钥证书  ,客户端公钥证书 客户端配置  客户端秘钥+密码 服务器公钥证书 目前android验证ok,pc浏览器添加客户端秘钥证书  ,访问还是失败,待继续查找资 ...

  8. soapui测试https双向验证p12项目

    1.准备好p12 和jsk秘钥文件 2.配置soapui ssl 其中: 1:jks就是放在trustStore那里,密码填写为 106075 2:p12放到keystore,密码填写:180000 ...

  9. HTTPS实战之单向验证和双向验证

    转载自:https://mp.weixin.qq.com/s/UiGEzXoCn3F66NRz_T9crA 原创: 涛哥 coding涛 6月9日 作者对https 解释的入目三分啊 (全文太长,太懒 ...

随机推荐

  1. android studio 中jni底层日志的打印

    1 添加ndk对log支持若需要添加ndk对log的支持,只需要通过以下2步即可实现. 1.1 修改Android.mk如生成的库文件是“.so文件”,则在Android.mk中添加如下内容:LOCA ...

  2. MongoDB快速入门教程(3.1)

    3.MongoDB进阶 3.1.权限验证 以下内容适用于Mac系统用户,window系统用户请看后面文档 3.1.1.创建超级管理员用户 默认情况下连接mongodb是不需要用户名和密码的,这样不安全 ...

  3. mpvue实战-手势滑动导航栏

    写点东西记录一下美好时光,上周学习了一下通过mpuve开发微信小程序,看完文档,就准备撸起袖子加油干的时候,一开始就被支持手势滑动的导航栏给搞懵逼了.求助一波百度和谷歌未果后,只能自己动脑动手!为了给 ...

  4. jvm字节码和类加载机制

    Class类文件的结构 任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来说,类或接口并不一定都得定义在文件里(类和接口也可以用反射的方式通过类加载器直接生成) Class文件时一组以 ...

  5. \\u4e00-\\u9fa5\

    select * from stu where name regexp '[\\u4e00-\\u9fa5\·]{2,10}$'; 结果: name这个字段从后到前 2 到10个字符之内 如果有汉字 ...

  6. 由VIP漂移引发的算法异常问题调查和解决

    最近工作中的一个问题,耗时一个月之久终于调查完毕且顺利解决,顿时感慨万千.耗时之久和预期解决时间和环境搭建以及日志不合理等等有关,当然这个并非此文的重点.之所以在很久以后的今天又开始写文,主要是这个问 ...

  7. Python——格式化GMT时间

    1.背景 最近在做视频上传去获取大小.时间的功能,视频是存在金山云的,由于金山sdk接口用例执行后返回的结果中的时间是http头部时间,时间格式为‘Tue, 08 May 2018 06:17:00 ...

  8. 关于c++中结构体列表初始化,聚合问题

    聚合(aggregate) C++语法规定:不能使用初始值列表来初始化"非聚合(non-aggregate)"的对象.那么,什么才算是"聚合"呢?C++认为聚合 ...

  9. linux环境下安装 openOffice4并启动服务

    一.背景故事 openOffice是用来做office文档在线预览功能,把office文档转换成pdf交给前端显示. 之前系统开发过程一直没有将springboot服务怼上服务器,所以只安装了wind ...

  10. Spring IoC 公共注解详解

    前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 什么是公共注解?公共注解就是常见的Java ...