服务端和客户端证书各种组合下对访问者(浏览器/中间人)的影响

今天本来想研究下nginx下如果获取SSL指纹,但是环境没有装成功

就尝试了下如果不用nginx直接在服务端拿到SSL指纹,
没想到从创建自签名证书到如何开启证书,
以及服务端证书和客户端证书各种组合校验的测试就花了我很长时间。

(注意自签名证书用Rsa,我用Ecc的在asp5.0好像不支持,这里耗了我比较长时间)

所以SSL指纹就下一次在研究吧,有这方面经验的朋友欢迎加我微信交流(文末)!

本文介绍了服务端证书和客户端证书各种组合下,对于访问者(浏览器/中间人)的影响

本文代码基于aspnet5.0,其他语言实现文末有外链可参考

1. 开启服务端SSL

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseKestrel(options =>{options.ListenLocalhost(5002, listenOption =>{//设置证书var httpsOptions = new HttpsConnectionAdapterOptions();var serverCert = new X509Certificate2("server.pfx", "1234");httpsOptions.ServerCertificate = serverCert;listenOption.UseHttps(httpsOptions);});});webBuilder.UseStartup<Startup>();});

server.pfx是自己创建的证书,需要加到根信任中心

  • 浏览器访问https没问题

  • 中间人抓包没问题

  • 客户端HttpClient访问没问题

2. 开启客户端证书验证

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseKestrel(options =>{options.ListenLocalhost(5002, listenOption =>{//设置证书var httpsOptions = new HttpsConnectionAdapterOptions();//设置需要验证客户端正常开始httpsOptions.ClientCertificateMode = ClientCertificateMode.RequireCertificate;//设置需要验证客户端正常结束var serverCert = new X509Certificate2("server.pfx", "1234");httpsOptions.ServerCertificate = serverCert;listenOption.UseHttps(httpsOptions);});});webBuilder.UseStartup<Startup>();});

只需要加一句就搞定

但是注意 如果开启了客户端证书验证。浏览器就无法访问了。
中间人攻击如果没有证书的话 也无法完成!

  • 浏览器无法访问

  • 中间人无证书无法抓包

  • 客户端HttpClient得配置证书才能访问(下面)

3. 客户端用HttpClient加证书可以访问成功


private static async Task<string> GetApiDataAsync()
{try{//注意哈 这里要和服务端用的证书一样才行var cert = new X509Certificate2("server.pfx", "1234");var handler = new HttpClientHandler();handler.ClientCertificates.Add(cert);var client = new HttpClient(handler);var request = new HttpRequestMessage(){RequestUri = new Uri("https://localhost:5002/WeatherForecast"),Method = HttpMethod.Get,};var response = await client.SendAsync(request);if (response.IsSuccessStatusCode){var responseContent = await response.Content.ReadAsStringAsync();return responseContent;}throw new ApplicationException($"Status code: {response.StatusCode}, Error: {response.ReasonPhrase}");}catch (Exception e){throw new ApplicationException($"Exception {e}");}
}

4. 服务端开启客户端证书校验


public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseKestrel(options =>{options.ListenLocalhost(5002, listenOption =>{//设置证书var httpsOptions = new HttpsConnectionAdapterOptions();//设置需要验证客户端正常开始httpsOptions.ClientCertificateMode = ClientCertificateMode.RequireCertificate;//设置需要验证客户端正常结束//设置服务端验证客户端 开启SSL Pinning starthttpsOptions.CheckCertificateRevocation = true;httpsOptions.ClientCertificateValidation +=(certificate2, chain, arg3) =>{//return true;//this is where we verify the thumbprint of a connected client matches the thumbprint we expect//NOTE: this is just a simple example of verifying a client cert.// 2A39D43A8FE2CAE54542C768F61AE79097FAB6F5 这个是我那个证书的 测试的话需要换下return certificate2.Thumbprint.Equals("2A39D43A8FE2CAE54542C768F61AE79097FAB6F5",StringComparison.InvariantCultureIgnoreCase);};               //设置服务端验证客户端 开启SSL Pinning endvar serverCert = new X509Certificate2("server.pfx", "1234");httpsOptions.ServerCertificate = serverCert;listenOption.UseHttps(httpsOptions);});});webBuilder.UseStartup<Startup>();});

注意:服务端开启验证的前提是需要客户端传证书

相比上面一步,更加保证了客户端传的证书的安全性。

而且只要约束了客户端传证书,中间人抓https的包如果拿不到证书是无法抓的!!

  • 浏览器无法访问

  • 中间人无证书无法抓包

  • 客户端HttpClient得配置证书才能访问(同上)

5. 客户端开启SSL Pinning

不需要客户端传证书(不需要服务端强制开启客户端传证书)

只在客户端验证服务端证书。

客户端HttpClient访问增加开启 SSL Pinning


var handler = new HttpClientHandler();
var client = new HttpClient(handler);
//增加开启 SSL Pinning
handler.ServerCertificateCustomValidationCallback = (request, cert, chain, errors) =>
{//2A39D43A8FE2CAE54542C768F61AE79097FAB6F5 这个是我那个证书的 测试的话需要换下return cert.Thumbprint.Equals("2A39D43A8FE2CAE54542C768F61AE79097FAB6F5",StringComparison.CurrentCultureIgnoreCase);
};var request = new HttpRequestMessage()
{RequestUri = new Uri("https://localhost:5002/WeatherForecast"),Method = HttpMethod.Get,
};var response = await client.SendAsync(request);

试下对中间人攻击有没有效果

开启并设置Fiddler代理

handler.Proxy = new WebProxy("127.0.0.1:8888");

如上图,启动中间人攻击后的服务端证书签名变了

  • 浏览器可访问

  • 中间人无证书情况无法抓包

综上
在客户端启动SSL pinning 最简单,成本最小,其他语言都有比较简单的实现

上面演示的证书链只有一条,验证的时候也可以对整个证书链遍历,每个都验证最为稳妥!


不过不能以为客户端开启了SSL Pinning就安全了,因为客户端有Hook(xpose,frida).

SSL指纹有感兴趣的可以加我交流,备注下ssl。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如果科学家封神,会有什么称号?

全世界只有3.14 % 的人关注了数据与算法之美你听说过“天雷真君”吗&#xff1f;你知道“虐猫狂人"吗&#xff1f;其实这两个称号是网友分别送给大科学家富兰克林和薛定谔的。今天让我们看看伟大的科学家们还有一些什么有趣的称号。尺规小王子高斯如来神展傅立叶勾股圣手—…

mac php mcrypt,MacOSX 10.10安装mcrypt详细教程分享

mcrypt 是使用安全技术来交换数据文件加密方法. 这是必需的&#xff0c;例如一些 Magento 的 Web 应用程序,购物车软件或一个 PHP 框架&#xff0c;比如 Laravel. 本教程在 OS X 10.10 Yosemite 经过测试。本指南是真正为用户提供了PHP运行于OSX Yosemite 的5.5.14 版本。其他下…

WPF加载高德地图

WPF开发者QQ群&#xff1a; 340500857 前言 有小伙伴问如何加载高德地图。欢迎转发、分享、点赞&#xff0c;谢谢大家~。 接着上一篇源码中放了我的 BingMap Key 请大家不要滥用&#xff0c;谢谢。也可以自行申请 BingMap Key https://www.bingmapsportal.com/效果预览&#x…

深度学习与机器学习到底什么关系?

最近广州的天气老是变幻无常&#xff0c;前脚还冻得瑟瑟发抖&#xff0c;后脚又开始夏天模式&#xff08;如下图&#xff09;&#xff0c;让小天甚是怀念每天艳阳高照的夏天&#xff0c;虽然热了点但好歹不用担心猝不及防地收到寒风暴雨黄色预警。说到夏天&#xff0c;不得不提…

全选按钮的使用。winfrom程序中,对全选按钮的理解,欢迎拍砖!

最近在做公司项目时&#xff0c;用到了一些单选多选的处理情况。特编辑此文&#xff0c;欢迎批评指正。&#xff08;有图有真相&#xff09; winfrom程序。 首先&#xff0c;需要绑定某些用户&#xff0c;该用于由当前登陆用户获取。 private void BindUser() { …

理工男一般不浪漫,一浪漫便值很多年

今晚是平安夜接下来就是圣诞元旦小木先祝大家幸福、快乐、健康一年一度“最佳”圣诞元旦礼物奖就要发表了中了直男毒的礼物你们挚爱的女朋友可是不要的哦今天小木就大家扒一扒满满直男的礼物是怎样的&#xff01;Part 1“男票送了我一箱木瓜&#xff0c;说是丰胸疗程&#xff0…

C#序列化与反序列化详解

什么是序列化以及如何实现序列化&#xff1f;序列化是通过将对象转换为字节流&#xff0c;从而存储对象或将对象传输到内存&#xff0c;数据库或文件的过程。主要用途是保存对象的状态&#xff0c;包括对象的数据&#xff0c;以便能够在需要是重建对象。反向过程称为 反序列化。…

TLS是如何保障数据传输安全(中间人攻击)

前言前段时间和同事讨论HTTPS的工作原理&#xff0c;当时对这块知识原理掌握还是靠以前看了一些博客介绍&#xff0c;深度不够&#xff0c;正好我这位同事是密码学专业毕业的&#xff0c;结合他密码学角度对tls加解密(DH这块)的阐述&#xff0c;让我对这块原理有了更进一步的理…

除了 Python ,这些语言写的机器学习项目也很牛

全世界只有3.14 % 的人关注了数据与算法之美Python 由于本身的易用优势和强大的工具库储备&#xff0c;成为了在人工智能及其它相关科学领域中最常用的语言之一。尤其是在机器学习&#xff0c;已然是各大项目最偏爱的语言。其实除了 Python &#xff0c;也不乏有开发者用其他语…

马斯克又要搞事情,不锈钢材质的Space X“星际飞船”正式亮相

全世界只有3.14 % 的人关注了数据与算法之美近日&#xff0c;据美国科技媒体 Teslarati 报道&#xff0c;今年 Space X &#xff08;太空探索技术公司&#xff09;已经开始研发“星际飞船”&#xff08;Starship&#xff09;和 “Super Heavy”&#xff0c;而“星际飞船”则是火…

记一次 .NET 某外贸Web站 内存泄漏分析

一&#xff1a;背景 1. 讲故事上周四有位朋友加wx咨询他的程序内存存在一定程度的泄漏&#xff0c;并且无法被GC回收&#xff0c;最终机器内存耗尽&#xff0c;很尴尬。沟通下来&#xff0c;这位朋友能力还是很不错的&#xff0c;也已经做了初步的dump分析&#xff0c;发现了托…

java取整公式,Java取整函数 四舍五入函数-Go语言中文社区

简介Math类中提供了5个与取整相关的函数&#xff0c;如下所示&#xff1a;static double ceil(double a)&#xff1a;天花板函数&#xff0c;返回大于等于a的最小整数(但是以浮点数形式存储)。static double floor(double a)&#xff1a;地板函数&#xff0c;返回小于等于a的最…

这些优质的教育类公众号您知道么,非常实用!

随着新媒体的发展壮大&#xff0c;教育类微信号林林总总数不胜数&#xff0c;官方的、媒体的、学校的……让人眼花缭乱&#xff0c;不知如何选择&#xff0c;今天&#xff0c;小编要向您推荐一些优质且实用的教育类公众号&#xff0c;请大家立即关注。长按二维码&#xff0c;选…

ML.NET Cookbook:(3)如何从CSV加载包含多个列的数据?

TextLoader用于从文本文件加载数据。您需要指定什么是数据列、它们的类型以及在文本文件中的位置。当输入文件包含许多相同类型的列&#xff08;通常打算一起使用&#xff09;时&#xff0c;我们建议从一开始就将它们作为向量列进行加载&#xff1a;这样&#xff0c;数据的架构…

hdu 4267 A Simple Problem with Integers

http://acm.hdu.edu.cn/showproblem.php?pid4267 一道加强版的树状数组题&#xff0c;利用题目的关键点——除数较小&#xff0c;可以想到将除数跟余数分类&#xff0c;最多分成55种情况&#xff0c;也就是每个结点存放55个数据的的树状数组。 建树相对简单&#xff0c;遵循思…

php年月日滚动选择,Unity3d—做一个年月日选择器(Scroll Rect拖动效果优化)— 无限滚动 + 锁定元素...

[导读]最近.....废话不多说上效果图用的是UGUI我先说思路通过判断元素的位置信息来改变Hierarchy的顺序 实现无限滚动改变位置的同时也要不断的调整Content的位置防止乱跳元素锁定就是直接锁死的元素的移动范围 当只有拖动大于一定程度时最近.....废话不多说上效果图用的是UGUI…

3秒取暖,超高颜值!冬日必备的大宇取暖器

天气越来越冷了&#xff0c;在小木冷的瑟瑟发抖的时候&#xff0c;朋友推荐了一台最新款的大宇取暖器&#xff0c;本来我怕是个鸡肋。但颜值确实是小木喜欢的呀&#xff0c;我就让怕冷的朋友先用用看&#xff0c;结果惊讶了&#xff01;这产品开了一会&#xff0c;朋友的小办公…

.Net Core with 微服务 - 架构图

上一次我们简单介绍了什么是微服务&#xff08;.NET Core with 微服务 - 什么是微服务&#xff09;。介绍了微服务的来龙去脉&#xff0c;一些基础性的概念。有大佬在评论区指出说这根本不是微服务。由于本人的能力有限&#xff0c;大概也只能理解到这个层次。先不管它到底是不…

win10+tomcat+php+配置环境变量配置,Win10系统Tomcat环境变量配置方法

在Win10系统中配置Tomcat环境变量之前&#xff0c;需要先配置JAVA&#xff0c;之后就可以配置Tomcat环境了&#xff0c;网络上的教程要么太简单&#xff0c;不明觉厉&#xff0c;要么太复杂&#xff0c;笔者整理了以下思路&#xff0c;便是以下Win10系统Tomcat环境变量配置方法…