.net core https 双向验证
文章来自:https://www.cnblogs.com/axzxs2001/p/10070562.html
关于https双向认证的知识可先行google,这时矸接代码。
为了双向认证,我们首先得准备两个crt证书,一个是client.crt,一个是server.crt,有时为了验证是否同一个根证书的验证,这两个证书可以共有一个根证书root.crt。
首先要生成这些证书,这里采用了自签证书方式:
证书生成工具可在这里下载(windows下生成):
安装完成后在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 双向验证的更多相关文章
- linux:Nginx+https双向验证(数字安全证书)
本文由邓亚运提供 Nginx+https双向验证 说明: 要想实现nginx的https,nginx必须启用http_ssl模块:在编译时加上--with-http_ssl_module参数就ok.另 ...
- nginx配置https双向验证(ca机构证书+自签证书)
nginx配置https双向验证 服务端验证(ca机构证书) 客户端验证(服务器自签证书) 本文用的阿里云签发的免费证书实验,下载nginx安装ssl,文件夹有两个文件 这两个文件用于做服务器http ...
- Java Https双向验证
CA: Certificate Authority,证书颁发机构 CA证书:证书颁发机构颁发的数字证书 参考资料 CA证书和TLS介绍 HTTPS原理和CA证书申请(满满的干货) 单向 / 双向认证 ...
- Https双向验证与Springboot整合测试-人来人往我只认你
1 简介 不知不觉Https相关的文章已经写了6篇了,本文将是这个专题的最后一篇,起码近期是最后一篇.前面6篇讲的全都是单向的Https验证,本文将重点介绍一下双向验证.有兴趣的同学可以了解一下之前的 ...
- ssl/https双向验证的配置
1.SSL认证 不需要特别配置,相关证书库生成看https认证中的相关部分 2.HTTPS认证 一.基本概念 1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源 2.双向认证,如果客户端 ...
- ssl https双向验证的配置与证书库的生成
1.SSL认证 不须要特别配置,相关证书库生成看https认证中的相关部分 2.HTTPS认证 一.基本概念 1.单向认证,就是传输的数据加密过了,可是不会校验client的来源 2.双向认证,假设 ...
- https 双向验证
服务器配置 服务器秘钥 服务器公钥证书 ,客户端公钥证书 客户端配置 客户端秘钥+密码 服务器公钥证书 目前android验证ok,pc浏览器添加客户端秘钥证书 ,访问还是失败,待继续查找资 ...
- soapui测试https双向验证p12项目
1.准备好p12 和jsk秘钥文件 2.配置soapui ssl 其中: 1:jks就是放在trustStore那里,密码填写为 106075 2:p12放到keystore,密码填写:180000 ...
- HTTPS实战之单向验证和双向验证
转载自:https://mp.weixin.qq.com/s/UiGEzXoCn3F66NRz_T9crA 原创: 涛哥 coding涛 6月9日 作者对https 解释的入目三分啊 (全文太长,太懒 ...
随机推荐
- MongoDB入门二
MongoDB配置 本地启动 c:\MongoDB\bin>mongod.exe --dbpath "C:\\MongoDB\data\db" --logpath " ...
- jQurey zTree Demo 3.5
https://jeesite.gitee.io/front/jquery-ztree/3.5/demo/cn/index.html
- 问题记录--jekyll serve 启动的时候如何指定80端口
jekyll serve --host 0.0.0.0 --port 80 启动失败
- LINUX 下 一些常用的信息显示命令:
tcsh——shell程序,它可以在登录shell和shell 脚本命令处理器之间做命令语言解释器.stat——显示指定文件的相关信息who.w——显示在线登陆用户whoami——显示用户自己的身份h ...
- 模型评测之IoU,mAP,ROC,AUC
IOU 在目标检测算法中,交并比Intersection-over-Union,IoU是一个流行的评测方式,是指产生的候选框candidate bound与原标记框ground truth bound ...
- ORA-39257: Data cannot be remapped for more than 10 columns.
ORA-39257: Data cannot be remapped for more than 10 columns. 前言 还是脱敏数据相关的事情. 使用expdp的remap_data参数对指定 ...
- CSS粘性定位
粘性定位(position:sticky) 1.定义 粘性定位可以被认为是相对定位和固定定位的混合.元素在跨越特定阈值前为相对定位,之后为固定定位.(MDN传送门) 这个特定阈值指的是 top, ri ...
- 特殊方格棋盘【状压DP】
特殊方格棋盘[状压DP] 讲真状压DP这个东西只不过是有那么亿丢丢考验心态罢了(确信) 先从板子题说起,另加一些基础知识 题目描述 在的方格棋盘上放置n 个车,某些格子不能放,求使它们不能互相攻击的方 ...
- Redis做为缓存的几个问题
缓存理流程: 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果. 1.缓存雪崩 解决方案3:如果缓存数据库是分布 ...
- day18 作业
目录 1.编写课上讲解的有参装饰器准备明天默写 2.在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作 3.编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017- ...