我们来一起说说HTTPS中间人***与证书校验
一、前言
随着安全的普及,https通信应用越发广泛,但是由于对https不熟悉导致开发人员频繁错误的使用https,例如最常见的是未校验https证书从而导致“中间人***”,并且由于修复方案也一直是个坑,导致修复这个问题时踩各种坑,故谨以此文简单的介绍相关问题。
本文第一节主要讲述https的握手过程,第二节主要讲述常见的“https中间人***”场景,第三节主要介绍证书校验修复方案,各位看官可根据自己口味浏览。
二、HTTPS握手过程
首先来看下https的工作原理,上图大致介绍了https的握手流程,后续我们通过抓包看下每个握手包到底干了些什么神奇的事。
注:本文所有内容以TLS_RSA_WITH_AES_128_CBC_SHA加密组件作为基础进行说明,其他加密组件以及TLS版本会存在一定差异,例如TLS1.3针对移动客户端有了很大的改动,现在的ECDHE等密钥交换算法与RSA作为密钥交换算法也完全不一样,所以有些地方和大家实际操作会存在一定出入。
1.TCP三次握手
我访问的支付宝的官网www.alipay.com抓取的数据。
2.Client Hello
TLS的版本号和随机数random_c:这个是用来生成最后加密密钥的因子之一,它包含两部分,时间戳和随机数 session-id:用来标识会话,第一次握手时为空,如果以前建立过,可以直接带过去从而避免完全握手 Cipher Suites加密组件列表:浏览器所支持的加密算法的清单客户端支持的加密签名算法的列表,让服务器进行选择 扩展字段:比如密码交换算法的参数、请求主机的名字,用于单ip多域名的情况指定域名。
3.Sever Hello
随机数rando_s,这个是用来生成最后加密密钥的因子之一,包含两部分,时间戳和随机数 32字节的SID,在我们想要重新连接到该站点的时候可以避免一整套握手过程。 在客户端提供的加密组件中,服务器选择了TLS_RSA_WITH_AES_128_CBC_SHA组件。
4.Certificate
证书是https里非常重要的主体,可用来识别对方是否可信,以及用其公钥做密钥交换。可以看见证书里面包含证书的颁发者,证书的使用者,证书的公钥,颁发者的签名等信息。其中Issuer Name是签发此证书的CA名称,用来指定签发证书的CA的可识别的唯一名称(DN, Distinguished Name),用于证书链的认证,这样通过各级实体证书的验证,逐渐上溯到链的终止点,即可信任的根CA,如果到达终点在自己的信任列表内未发现可信任的CA则认为此证书不可信。
验证证书链的时候,用上一级的公钥对证书里的签名进行解密,还原对应的摘要值,再使用证书信息计算证书的摘要值,最后通过对比两个摘要值是否相等,如果不相等则认为该证书不可信,如果相等则认为该级证书链正确,以此类推对整个证书链进行校验。
二级机构的证书。
支付宝官网签名证书。
不仅仅进行证书链的校验,此时还会进行另一个协议即Online Certificate Status Protocol, 该协议为证书状态在线查询协议,一个实时查询证书是否吊销的方式,客户端发送证书的信息并请求查询,服务器返回正常、吊销或未知中的任何一个状态,这个查询地址会附在证书中供客户端使用。
5.Server Hello Done
这是一个零字节信息,用于告诉客户端整个server hello过程已经结束。
6.ClientKeyExchange
客户端在验证证书有效之后发送ClientKeyExchange消息,ClientKeyExchange消息中,会设置48字节的premaster secret(因为的TLS版本的原因,这里没有显示premaster),通过密钥交换算法加密发送premaster secret的值,例如通过 RSA公钥加密premaster secret的得到Encrypted PreMaster传给服务端。PreMaster前两个字节是TLS的版本号,该版本号字段是用来防止版本回退***的。
从握手包到目前为止,已经出现了三个随机数(客户端的random_c,服务端的random_s,premaster secret),使用这三个随机数以及一定的算法即可获得对称加密AES的加密主密钥Master-key,主密钥的生成非常的精妙。
7.Change Cipher Spec
发送一个不加密的信息,浏览器使用该信息通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信。
8.Encrypted Handshake Message
验证加密算法的有效性,结合之前所有通信参数的 hash 值与其它相关信息生成一段数据,采用协商密钥 session secret 与算法进行加密,然后发送给服务器用于数据与握手验证,通过验证说明加密算法有效。
9.Change_cipher_spec
Encrypted Handshake Message通过验证之后,服务器同样发送 change_cipher_spec 以通知客户端后续的通信都采用协商的密钥与算法进行加密通信。
10.Encrypted Handshake Message
同样的,服务端也会发送一个Encrypted Handshake Message供客户端验证加密算法有效性。
11.Application Data
经过一大串的的计算之后,终于一切就绪,后续传输的数据可通过主密钥master key进行加密传输,加密数据查看图中的Encrypted Apploication Data字段数据,至此https的一次完整握手以及数据加密传输终于完成。
https里还有很多可优化并且很多精妙的设计,例如为了防止经常进行完整的https握手影响性能,于是通过sessionid来避免同一个客户端重复完成握手,但是又由于sessionid消耗的内存性能比较大,于是又出现了new session ticket,如果客户端表明它支持Session Ticket并且服务端也支持,那么在TLS握手的最后一步服务器将包含一个“New Session Ticket”信息,其中包含了一个加密通信所需要的信息,这些数据采用一个只有服务器知道的密钥进行加密。这个Session Ticket由客户端进行存储,并可以在随后的一次会话中添加到 ClientHello消息的SessionTicket扩展中。虽然所有的会话信息都只存储在客户端上,但是由于密钥只有服务器知道,所以Session Ticket仍然是安全的,因此这不仅避免了性能消耗还保证了会话的安全性。
最后我们可以使用openssl命令来直观的看下https握手的流程:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Nginx搭建部署Web服务器并与NFS结合搭建负载均衡服务器
Nginx搭建部署Web服务器并与NFS结合搭建负载均衡服务器 一、搭建NginxWeb服务器 此种方式是用yum安装Nginx,为保证安装成功需在安装之前提前安装epel扩展源。 用yum安装Nginx 关闭系统防火墙 查看Nginx配置文件 安装完成后启动Nginx并查看其运行状态 然后在客户端浏览器里面输入Nginx服务器的IP地址即可验证Nginx工作正常 二、搭建NFS服务器 NFS:网络文件系统它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。 三、使用nginx搭建反向代理服务器,并分别使用轮询、权重、及IP_hash的方式调度访问请求。 四、nginx反向代理+三台web+nfs共享存储实现集群配置
- 下一篇
提高 SharePoint 页面访问速度之应用池预加载
之前我的一篇文章给大家粗略的讲了一下关于 IIS应用池回收给 SharePoint 带来的访问速度的提升, 详见 http://horse87.blog.51cto.com/2633686/1895153 前几天和几位MVP一起又讨论学习了一下关于IIS应用池的回收问题,今天来给大家再铺开来讲一讲。 简单来说,我么服务器IIS中的应用程序池,可以看做是一个网站的资源边界,当网站要与系统资源发生交互的时候,实际上会通过应用程序池,再由池子去请求系统资源,分配给网站,一个网站所能使用到的系统资源可以通过池子来进行控制。 我们大家可以这样理解,网站本身是静态存在的,但是应用池是动态的。 池子里面包括了:网站所占用的进程,内存虚拟地址,会话状态等,这些内容都是保存在池子里面。通过应用池可以对一个网站进行合理的资源管控。比如,当一个网站的CPU使用达到了某个峰值,内存使用达到了某个峰值,或者到了某个请求数,就把这个应用池进行回收。 我们其实可以稍微屡一下思路,当我们访问一个网站的时候,实际上是去访问了一个IIS的网站集,这个时候IIS会通知这个池子,“现在有人来 访问你了”,然后池子会启动一个W...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- 2048小游戏-低调大师作品
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- Red5直播服务器,属于Java语言的直播服务器
- Mario游戏-低调大师作品