先来抓一个SSL双向的数据包看一看

自认为抓的这个数据包是非常规范的,哈哈~~~
具体的划分是这样的

下面我们来具体的对SSL中每一条命令进行分析
- Client Hello 。
打开Client hello的一条报文,可以看到里面包含了握手的类型,支持的SSL或者TLS的协议版本,客户端的随机数和时间戳,session id,支持的所有密码套件,以及一些压缩算法等(这里的随机数为32字节)

- Server Hello。
打开sever hello的报文,我们可以看到握手类型、服务器支持的ssl或tls版本号,服务器的随机数据和时间戳,session id,服务器确定的密码套件(这个密码套件是从上一条客户端发送过来的包里选择的,经过这一个“对话”,确定了密钥交换的算法,就是在交换对话密钥的时候用此算法进行加密)

通常可以看到certificate、certificate request、server hello done在同一条报文中 - Certificate。
打开certificate报文,可以看到,消息的类型、证书的大小、证书的详细信息,这里的证书是指服务器所配置的证书以及此证书的根证(我的链只有两个),发送过来的其实是整个证书链,从服务端配置的证书,一直到自签的根证

- Certificate Request。
打开certificate request报文是只有在双向认证的时候才可以抓到,是服务器向客户端索要客户端的证书的报文,在该报文中可以看到握手的类型,要求客户端使用的签名算法,以及服务器端信任的CA证书(也就是服务器相信哪些CA颁布的证书)

- Server Hello Done。
打开server hello done的报文,这一条报文并没有含有什么报文,主要是用于通知浏览器,服务器端的hello过程结束了

打开下一条报文,是客户端向服务器发送的,里面有certificate、client key exchange、certificate verify、change cipher spec、encrypted handshake message - Certificate。
打开第一条进行具体分析,certificate,代表的是双向认证中的客户端的证书(提供了公钥哦),可以看到证书的大小,证书的各项内容(这里有其上级证书的信息)

- Client Key Exchange。
client key exchange报文里可以看到被加密的预主密钥(预主密钥是被服务器端的公钥进行加密的,这里是非对称加密算法;预主密钥由客户端产生的一个随机数),由客户端的浏览器发往服务端

- Certificate Verify。
Certificate verify 也是只有在双向认证的时候才可以查看,该证书的意义是客户端提供证书以后,使用客户端对应的私钥做一个签名值用于服务器端对客户端的身份进行验证(主要是对预主密钥和随机数做的签名)

- Change Cipher Spec。
Change cipher spec报文就是通知对端接下来要使用协商好的密钥进行加密通讯了,encrypted handshake message指的是在正常传输应用数据之前要对协商的密钥进行一个验证,并对以上所有的握手消息做一个完整性的校验,下图是客户端发送给服务器端的报文,服务器端也会发送同名的报文给客户端,通知客户端服务器接下来要进行加密通讯了,验证了握手过程的完整性(这个协商出来的密钥就是对话密钥,对话密钥是对称密钥,这个对话密钥是客户端和服务器端双方各自利用前面得到的信息进行一系列的计算得到的)

如果密钥校验和握手过程的完整性都通过了,接下来就使用验证通过的key和mac密钥对应用层的数据进行加密封装传输,对端使用相同的key和mac密钥进行解密,至此加密通道完整建立 - Finished。
客户端SSL握手结束标志 - Change Cipher Spec。
与上面的功能一样 - Finished。
服务器端的SSL握手结束。
注意:预备密钥和客户随机数加上服务器的随机数经过信息摘要算法生成主密钥
主密钥和客户随机数加上服务器的随机数经过信息摘要算法生成对称密钥,用于对话,也就是对话秘钥
本文深入解析SSL双向认证的过程,包括Client Hello、Server Hello、Certificate、Client Key Exchange等关键步骤,详细阐述了证书、预主密钥、对话密钥的生成与验证,确保加密通道的安全建立。

3203

被折叠的 条评论
为什么被折叠?



