其实很复杂,咱也只是学习其中的一小块
打开wireshark,监听相应端口 访问https://xz.aliyun.com 过滤,ip.addr == ip地址 这个ip地址是cdn的ip,你可以通过ping xz.aliyun.com 来获得,大家应该都不一样
https整个过程
首先是tcp三次握手 然后tls建立连接 最后http发送消息
首先看tcp三次连接
首先11.414471s发送第一个tcp连接,经过0.000068s 后又发送了一个tcp连接,连续发送了两个,应该是系统防止一个请求容易产生失误。 过了0.042s 之后xz.aliyun.com返回了syn ack 紧接着系统于0.000103s 之后马上返回ack 过程是两个tcp连接并行的,为了防止一个连接容易产生失误。 最终选择了第二个建立连接57501 端口
具体过程如下
握手完毕
tls建立连接
可以看这个图(图1)有个初步了解
然后我根据wireshark截获的图一步步探索
1.Client Hello
客户端首先建立连接
我们只关注tcp层/tls v1.2/HandShake Protocol: Client Hello 传输的数据 其中主要关注以下信息: 1.客户端生成的随机数c63a917777febe41f965c4408a5e2ee22442bf1a8b0a52721f06a32f ,对应于图1中的client random 2.客户端支持的加密算法列表(Cipher Suites)之后服务器回复从客户端的列表中选择的密码套件(后面会有具体的解释) 3.客户端支持的压缩算法列表(Compression Methods) 还看到一堆Extension扩展部分 4.支持的TLS版本信息 5.签名算法
2.Server Hello
server发送了 server randoma10bb82be8f1efebfd2e0858d1dfa8ea0f01dbe13dafe8f9944aa44be9c281c4 同时告诉客户端选择的密码套件Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) 和TLS 1.2 版本 解释一下,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) 定义一个密钥交换算法、一个批量加密算法、一个消息认证码(MAC)算法。: 密钥交换算法:使用RSA 用于决定客户端与服务器之间在握手时如何身份验证 批量加密算法:AES_128_GCM 加密消息流 消息认证码算法:SHA256 用于创建密码散列函数,消息流每个数据块的加密散列。(用于摘要验证的哈希函数)
伪随机函数,例如TLS 1.2的伪随机函数使用MAC算法的散列函数来创建一个主密钥——连接双方共享的一个48字节的私钥。主密钥在创建会话密钥(例如创建MAC)时作为一个熵来源。
3.Certificate, Server Key Exchange, Server Hello Done
依次对以下tls查看
certificate(证书)
服务端接收到客户端的Client Hello之后,服务端需要将自己的CA证书发送给客户端 证书是对服务端的一种认证,是由专门的数字证书认证机构(CA)审核之后颁发的,所以一般人无法伪造。在颁发证书的同时还会产生两把钥匙,一把私钥,一把公钥。私钥由服务端保管不可泄露,公钥则附带在证书中公开。证书本身还附带了一个证书电子签名,这个签名用来验证证书的完整性和真实性,防止证书被人窜改。 加密摘要算法对应serverhello时所选择的TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) ,rsa以及sha256
server key exchange(服务端交换key)
这种属于ECDHE(EC Diffie-Helloman Server Params) HTTPS常用的密钥交换算法有两种,一种是RSA(过时),另一种是ECDHE(对称加密) 什么是密钥交换呢?就是通过传递一些参数,并且双方通过计算确定对称加密的密钥,同时如果黑客获取了这些参数,也无法破解出密钥。 而值得注意的是,使用RSA算法需要tls四次握手,ECDHE只需要三次,即本文使用的算法。
ECDHE算法是这样演变的DH->DHE->ECDHE DHE是DH的实现,其中E(ephemeral:临时性的)代表客户端和服务器都生成临时的随机私钥,而不是只有客户端是随机的,而服务器是固定的 ECDHE是DHE算法的优化,减少了乘法运算,利用ECC椭圆曲线的特性减少计算量。
理解ECDHE才能明白server key exchange到底在干嘛,以及后续的client部分 原文:https://www.likecs.com/default/index/show?id=124371 回到数据: 椭圆曲线: 对椭圆曲线感兴趣的童鞋可以研究一下:https://zhuanlan.zhihu.com/p/40243602
server hello done(服务端hello结束)
内容部分Length: 0 ,仅有header,表示server hello结束
4.Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
client key exchange(客户端交换key)
客户端收到服务端的证书后首先会验证证书的有效性,根据证书链逐级验证,然后会用证书的公钥验证签名。 随后客户端生成一个随机私钥,根据服务端给的椭圆曲线,椭圆曲线基点G生成客户端公钥。发送给服务端 到现在为止,双方共享的信息有:
client random
server random
圆锥曲线
圆锥曲线基点G
服务端公钥
客户端公钥
服务端保留服务端私钥,客户端保留客户端私钥。
双方各自根据ECDHE算法计算出点(x,y) 然后最终的会话密钥是:[client random + server random + x ]
所有的文章都说tls是使用非对称加密,加密对称加密的密钥。现在看来最终的通信确实用对称加密,但是对称加密的密钥中的x是用ECDHE算法得来的,属于非对称加密。
change cipher spec(更改密码规格)
change cipher spec(更改密码规格) 算好会话密钥后客户端告诉服务器,已经算好了,可以用对称加密通信了
encrypted handshake message(加密握手信息)
encrypted handshake message(加密握手信息) 用来确认加密是否完成
Application Data:使用tls传递http数据
http-over-tls:使用tls加密过的http数据
参考: https://ocdman.github.io/2018/11/02/%E8%AF%A6%E8%A7%A3TCP%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E4%BB%A5%E5%8F%8ATLS-SSL%E6%8F%A1%E6%89%8B/ https://segmentfault.com/a/1190000021559557?_ea=29659396 https://www.likecs.com/default/index/show?id=124371
|