| 关键词: 密钥 客户端 证书 报文 加密 协议 使用 公钥 小李 进行 |
Https介绍https其实是在http上加了一层(SSL/TSL)加密协议,根据维基百科的解释:
我们用一张图来看看https的网络模型 图1. https网络模型图 传统的HTTP由于是明文传输,所以有以下安全风险:
而HTTPS通过加入(SSL/TSL)加密协议层,解决了上述三个风险。 接下来将通过抓取一个测试网站的HTTPS数据包,通过Wireshark对每个数据包进行详细分析。 本文的分析中,需要具备一些TCP/IP的基础知识。 测试网站首先我在自己的服务器上部署了一个最简单的网页, Let's Encrypt https://letsencrypt.org/zh-cn/getting-started/ 图2 图3. chrome浏览器证书查看 抓包工具在这里我们抓包工具使用Wireshark,这个工具是一个非常强大的网络抓包工具,可以用来分析各种底层协议。 在这里提供一个之前内部的Wireshark的分享ppt,可以帮助大家快速了解这个抓包软件,PPT的下载链接也放到文末附录中。 同时我将抓到的网络包放到文章末尾,如果大家抓包不方便,可以直接拿我抓的包进行分析。 分析过程请大家过滤ip.addr == 121.42.204.194 and tcp.port==443,这样就能看到所有与服务器的https的数据包了。 需要注意的是不同浏览器,或者不同的访问网站工具,对于https的具体实现可能有细微的差异。我这里使用的是mac系统下终端的crul命令行工具进行请求的。 图4. Wireshark过滤条件 https数据包分析图5.Https整体流程图 图5中的流程可以先简单有一个印象,接下来会结合上图中的流程,我们从抓包的请求中,依次分析相应的数据包。 Https的流程分为两部分,通过之前图1的网络模型可知,Https是在http中间加了一层,所以Https建立连接使用的仍然是tcp的三次握手。三次握手的包如下图6.由于Seq和Ack后面还会经常提到,所以我们简单描述下Seq与Ack的含义,关于TCP三次握手的详细过程,这里就不在展开叙述,有兴趣的同学可以参考网络上关于TCP三次握手的文章。 Tcp中Seq代表当前发送方数据的序号,单位是字节 Ack代表发送方期望下一次收到的数据的序号,言外之意就是,之前序号的数据都已经接受完毕。 client -> server SYN (Seq=0) server -> client SYN ACK (Seq=0,Ack=1) Client -> server ACK (Seq=1,Ack=1) 图6.TCP三次握手 Tcp的三次握手结束后,Tcp的连接已经建立,下面就开始TLS协议建立的过程。 client -> server (Client Hello)向服务端发送 1.客户端支持的协议;2.已经使用的TLS版本;3.随机数Random。这里我们将随机数记为Random1,记住这个随机数,后面还会提到。从下图中,我们也可以看出SSL层是基于TCP层又进行封装的一层协议。 图7.Client Hello 我们重点看几个TLS协议中的字段。 将Cipher Suites字段展开,如下图。代表客户端支持的加密协议簇列表。由于本次抓包使用的是curl工具,我们可以看到里面支持46种协议簇。每种协议簇代表不同的加密方式。不同的客户端支持的列表会有所不同,比如我的Chrome浏览器就只支持18种。 图8.支持的加密协议簇列表 协议各个字段代表的含义如下: 图9.协议簇各个字段含义 客户端发送完Client Hello(第27号报文),第28号报文server->client (Ack Seq=1 Ack=239),则是服务端向客户端发送的ACK确认消息,代表上面的Client Hello已经收到。这里也可以看出服务端是通过普通的TCP 的ACK消息去应答Client Hello,看上图7中,由于Client Hello 消息占用长度为238,所以回复的Ack就等于1+238 = 239,代表服务端从开始连接到目前已经收到了239序号。 server -> client (Server Hello)图10.Server Hello报文 服务端也生成了一个随机数,发送给了客户端,我们记为Random2。到目前为止客户端和服务的都已经拥有了(Random1和Random2)。同时服务端选择了一种加密协议簇作为后续与客户端交互的协议。 此协议簇中包含密钥协商算法,数据加密使用的对称密钥算法,数据校验的摘要算法(Cipher Suite:
为了解决这种问题,就有了DH(Diffie-Hellman)密钥交换算法。而ECDHE也是基于DH算法进行了一些效率的改进。 为了让我们的分析不陷入DH算法的细节中,我们只简单的使用一个例子来形象的说明下DH密钥交换算法的原理。 图11.DH密钥交换算法形象图 小张和小李做刷墙工作,他们想选取一种共同的颜色,但是又不想让在旁边的竞争对手听到。那么他们如何统一颜色呢?这个问 题的解决方案就是Diffie-Hellman密钥交换算法的最简单形式,接下来我们来一探究竟。 1.首先,小张先随便选择一种常见的颜色,比如黄色,作为公共颜色,然后告诉小李,她将在本次会议中使用黄色。显然,竞争对 手也可以听到,但是没有关系。 2.然后,小张和小李各自选取自己的秘密颜色,他们不会告诉对方。所以竞争对手永远不会知道秘密颜色。例如,小张选橙色作为 秘密颜色,小李选绿色。 3.接下来,小张将他的秘密颜色橙色和公共颜色黄色混合以产生新的颜色肉色。同理,小李也将他的秘密颜色绿色与公共颜色黄色 混合以生成新的蓝色。 4.小张和小李把新生成的颜色告诉彼此。这时候竞争对手能看到肉色和蓝色,但不是他们的秘密颜色。 5.交换完成后,小张会将她的秘密颜色(橙色)混合到小李发送的混合物(蓝色)中。小李会将他的秘密颜色(绿色)与小张发送 的混合物(肉色)混合。 6.现在小张和小李都达到了一种共同秘密色彩(棕色)的混合物。但是竞争对手将会被肉色和蓝色困住,不知道小张和小李的秘密 颜色,所以竞争对手永远不会得到他们俩得到的共同的秘密颜色。 这里,共同色(黄色)可以被视为服务器的公钥,每个人都可以使用。最后获得的共同秘密颜色可以被认为是用于在进一步的会话中加密数据的对称密钥。
server -> client (Certificate,Server key Exchange,Server Hello Done)图12.Certificate,Server key Exchange,Server Hello Done 这里服务端在一个TCP消息中,发送了三个TSL消息。
有兴趣的同学,可以逐一将证书的各个字段展开,进行对比查看。 图13.报文中证书链 图14.Chrome浏览器中查看证书链 说到这里,这里简单介绍一下www.gaotenglife.com这个证书的构成。 |
| 本文出处: https://www.toutiao.com/article/7157887410993627682/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|