.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 解释的入目三分啊 (全文太长,太懒 ...
随机推荐
- robot framework使用小结(二)
robot framework关键字驱动采用分层,结合Template做成数据驱动 我个人觉得不管是关键字驱动还是数据驱动,都是基于模块(或者是函数)的概念 新建测试案例baidu02,添加Libra ...
- Java设计模式十九——责任链模式
责任链模式 老李的苦恼 每个人在出生的时候,都早已在暗中被标好了三六九等. 老李是一名建筑工地的木匠,和大多数生活在社会最底层的农民工一样,一辈子老实本分,胆小怕事.在他们的心中,谁当老爷都没有区别, ...
- Java 从入门到进阶之路(二十六)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 的子接口 List,本章我们来看一下 Java 集合框架中的Collection 的子接口 Queue. 在之前我们讲 ...
- 超简单集成HMS Scan Kit扫码SDK,轻松实现扫码购
前言 在前面的文章中,我们向大家介绍了HMS Scan Kit 的快速集成方法以及HMS Scan Kit和其他开源扫码工具的竞争力对比分析,如果没有看到也没关系,文章下方的往期链接中有文章入口. ...
- 解密TaurusDB存储端高并发之线程池
摘要:为了能加快相关任务的高效执行,TaurusDB采用多线程技术处理的方式,增加处理器单元的吞吐能力,从而提高存储端的执行效率. 1. TaurusDB背景 随着云计算进入2.0时代,数据急剧膨胀, ...
- python基础知识练习3
1.如何实现 "1,2,3" 变成 ['1','2','3'] ? 如何实现['1','2','3']变成[1,2,3] ?(代码题) # 第一个问题 str1 = "1 ...
- Maven Jar包下载失败及解决方案
我是阿福,公众号「阿福聊编程」作者,一个在后端技术路上摸盘滚打的程序员,在进阶的路上,共勉! 文章已收录在 JavaSharing 中,包含Java技术文章,面试指南,资源分享. 明显的下载失败 具体 ...
- 性能测试之Jmeter中场景设置与启动方式
Jmeter场景设置与启动方式 性能测试场景是用来模拟模拟真实用户操作的工作单元,所以场景设计一定要切合用户的操作逻辑,jmeter主要是通过线程组配合其他组件来一起完成场景的设置. 线程组设置 Jm ...
- css实现1px 像素线条_解决移动端1px线条的显示方式
使用CSS 绘制出 1px 的边框,在移动端上渲染的效果会出现不同,部分手机发现1px 线条变胖了,这篇文章整理2种方式实现1px 像素线条. 1.利用box-shadow + transform & ...
- Tallest Cow,题解
题目链接 题意: 问满足一系列形如ab可以相互看到的约束的所有奶牛的最大身高(最高的编号和高度已给出) 分析: 首先,这个可以互相看到指的是中间的人比两头的都矮,一条斜线看到的不行,那么其实我们就可以 ...