SSL/TLS(1):基本概念通俗解释
SSL/TLS (2):通俗解释SSL/TLS为什么安全
SSL/TLS(3): CA证书解释

前言

在前面的文章中,我们讲述了SSL/TLS相关概念和CA证书,本文通过wireshark抓取日志,来查看一下TLS的连接握手流程。握手的含义就是当client与server建立连接后,client和server需要针对TLS进行握手动作,握手的目的是为了商量加密算法和一些初始化,只有握手成功后,后面的对话才能加密和解密。

测试工具

我们以mqtt+TLS连接 mqtt broker为例,MQTT broker中已经配置好TLS和证书,mqtt client使用mqtt.fx工具模拟,由于是公网,为了安全,我们将 公网IP的部分地址打马赛克,整个连接过程如下图所示:

1. TCP连接过程

正如前面的文章介绍,SSL/TLS是一个加密协议,用于加密传输层,所以SSL/TLS是介于TCP和应用层之间的,所以TLS连接的开始,一定是TCP的3次握手,与服务器建立连接,如下图所示:

就是普通的TCP 3次握手,建立连接

2. SSL/TLS 握手过程

SSL/TLS的 握手过程基本如下图所示:

我们总结握手流程,客户端名称为Client,服务器名称为 Server,流程如下:

  • 第1步:client给出协议版本号、1个客户端生成的随机数(client random),以及客户端支持的加密方法。
  • 第2步:server选择一种client支持的加密算法,并给出数字证书CA,以及1个由服务器生成的随机数(server random)。
  • 第3步:client确认数字证书CA的合法性,是否有效,然后根据前面两个随机数,生成1个新的随机数(premaster secret),并使用数字证书中的公钥,加密这个随机数,发送给client。
  • 第4步: server使用自己的私钥,解密获取client发送过来的随机数(premaster secret)
  • 第5步: client和server根据预定的加密方法,使用前面的3个随机数,生成对话密钥(session key),后面client 和server就使用 对话密钥来 加密整个对话过程。

在SSL/TLS (2):通俗解释SSL/TLS为什么安全 中我们分析了为什么SSL/TLS 安全,从上面的步骤也能看出,第1和2步都是明文传输,从第3步开始,第3个随机数通过公钥加密给server,因为采用了神奇的不对称加密算法,通过公钥加密的报文,必须通过私钥才能解开,所以对于监听者,只要没有私钥,就拿不到第3个随机数,那么后面的对话密钥,就更难破解了,再加上,上面的3个随机数,是随机生成的,就更增加了破解难度了。

上面的讲解,可能还是不够详细,接下来我们结合日志报文来进一步说明:

2.1 client hello

这是握手的第1步,抓包如下所示:

包含了随机数client random、客户端支持的加密算法(support ciphers)和SSL version等信息。

2.2 Server Hello、Certificate、Request、Done

2.2.1 Server Hello


这是第2步中的 server hello部分,server向client发送 server hello消息,这个消息会从client hello传过来支持的support ciphers中选择确定一份加密条件,另外还会生成一份随机数server random。

2.2.2 Certificate

这一步中,服务器将自己的公钥证书发给客户端,让客户端验证自己的身份,公钥证书里包含的内容,在前面的文章中已经讲过,这里不赘述。

2.2.3 Server Key Exchange

如果服务器使用DH算法,还会发送服务器使用的DH参数,RSA算法不需要这一步

2.2.4 Certificate Request

当我们采用SSL/TLS的双向认证时,服务器还会要求客户端上报自己的证书,对于安全性要求高的场景会用到,如下图所示:

注意: 这一步是可选的,对于SSL/TLS单向认证,就不需要这一步。

2.2.5 Server Hello Done

Server通知客户端 server hello 过程结束

2.3 certificate reply、client key exchange

2.3.1 certificate reply

在上一步中,server 会请求 client的证书,所以下一步,client理所应当的就要上报自己的证书,如下图所示:

可以看到,client 已经把自己的证书上报给server了,我们可以很容易的想到,server端应该会对client的证书做校验,一旦client的证书是非法的,会触发alert,终止连接。

2.3.2 client key exchange

这一步,client会 基于前面提到的两个随机数,再生成第3个随机数,然后通过server证书中的公钥,对第3个随机数加密,声称该一个密码PreMaster Key,然后传送给server,这里的关系如下:

  • 随机数3 = f(随机数1, 随机数2)
  • PreMaster = 公钥加密(随机数3)
    服务器收到PreMaster后,会使用自己的私钥解密,获取到随机数3的值,至此,client和server都知道了 这3个随机数了。
    有3个随机数来生成的秘钥不容易被暴力破解

2.4 Certificate Vertify

客户端会验证证书,比如验证证书的CN、证书时间等等,验证不通过会立刻发送 alert事件给服务器,终止握手过程。这个过程是客户端程序自动计算的,所以不会有抓包记录。
注意:我们在开发调试时,一般会采用mbedtls等开源库,加密、解密部分我们一般不会太深究,因为太复杂了,我们遇到问题的时候,大概率是证书验证这部分,因为要求证书的CN、证书时间等准确信息,后面我们会专门文章分析,如何调试这部分。

2.5 Change cipher spec (client)

这一步是客户端通知服务器,后面再发送的消息都会使用前面协商出来的秘钥进行加密,所以这个消息是一个事件消息

2.6 Encrypted handshake message(client)

这一步对应的是Cleint的Finish消息,client将前面握手的消息生成摘要,再用协商好的秘钥进行加密,这是客户端发出的第一条加密消息, 服务端接收后会用秘钥解密,能解出来说明前面协商的秘钥是一致的,至此握手完成。

2.7 change cipher spec(server)

这一步是server通知客户端,后面再发送的消息使用加密,这也是一条事件消息,与前面的相对应。

2.8 Encrypted handshake message(server)

这一步是server的finish消息,服务端会将握手过程消息生成摘要,然后再用秘钥加密,这是服务器发出的第一条加密消息,客户端接收后会用秘钥解密,能解出来就说明协商成功。

3 Application Data

至此,双方已经完成了SSL/TLS的握手,已经协商出秘钥,后面所有应用层数据都会用这个秘钥加密后,再通过TCP进行传输。

小结

双向认证的完整流程如下:

  • 1、TCP三次握手,建立连接。
  • 2、client发送 client hello
  • 3、server返回 server hello
  • 4、server 返回 CA证书,server Key Exchange、请求客户端证书, server hello Done
  • 5、client上报自己的证书给server,client key exchange,传输协商后的秘钥给server。
  • 6、client验证server的证书,change cipher spec、encrypted handshake
  • 7、server 发送 change cipher spec、encrypted handshake
  • 8、握手协商完成,进行应用层面交互,通过前面的协商秘钥来加密。

单向认证会少几步,主要是服务器请求客户端证书部分,基本流程是一致的。

SSL/TLS(4): TLS连接握手过程详细分析相关推荐

  1. http 协议的交互过程详细分析。

    http 协议的交互过程详细分析. 以wget <file>  wireshark 抓包分析. 在<netinet/ip.h> 中,有如下定义 struct iphdr   { ...

  2. MOSFET导通、关断过程详细分析、损耗分析、米勒效应、datasheet解释

    一,MOSFET导通.关断过程详细分析(转)详见下 MOSFET导通.关断过程详细分析(转) - 知乎 二,弄懂mosfet的导通过程和损耗分析  详见下 弄懂MOS管的导通过程和损耗分析 三.MOS ...

  3. Tip in/Out变速箱齿轮敲击过程详细分析

    Tip in/Out变速箱齿轮敲击过程详细分析(模型由AMEsim例子改造而成,数据均虚构,仅学习用) 1.发动机稳态工况 2.Tip in/Out工况 3.总结 1.发动机稳态工况 发动机输出力矩: ...

  4. WireShark 抓包理解 TLS 建立加密连接的过程

    一.实验环境 服务端:web容器 glassfish 部署了一个可以访问的web包 keystore.jks里添加的SSL证书,可参见 https://blog.csdn.net/yetugeng/a ...

  5. IMX6Q 启动过程详细分析

    一.预览 本文主要对IMX6Q的启动过程进行分析,主要参考文档来自NXP官方文档IMX6DQRM.pdf,使用的uboot为NXP官方提供uboot-imx,使用的开发板为迅为iTOP-i.MX6.N ...

  6. TCP/IP 协议简单分析(建立连接握手过程)

    原文:http://hi.baidu.com/wuguoyana/blog/item/38c04d3bcf047ce43a87ce55.html 首先TCP和IP是两种不同的协议,它们来七层网络模型中 ...

  7. uClinux 启动过程详细分析

    uclinux启动的详细过程有着诸多的信息可以给我们巨大的启发,我们在这里讨论的就是要对这些信息做一个具体细致的分析,通过我们的讨论,大家会对uclinux启动过程中出现的.以前感觉熟悉的.但却又似是 ...

  8. C#连接池的详细分析(转)

    来源: http://www.25175.com   作者: onrd 使用连接池 连接到数据库服务器通常由几个需要软长时间的步骤组成.必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次连 ...

  9. Hive map阶段缓慢,优化过程详细分析

    背景 同事写了这样一段HQL(涉及公司数据,表名由假名替换,语句与真实场景略有不同,但不影响分析): CREATE TABLE tmp AS SELECT t1.exk, t1.exv, M.make ...

最新文章

  1. linux 的重定向、管道、xargs 命令
  2. 面试官问:讲讲IP地址的分配原理?
  3. java jlist 图标_java – 将图像添加到JList项目
  4. [2021.1.13多校省选模拟2]T1(动态规划/轮廓线dp)
  5. Python3 与 C# 并发编程之~ 进程篇
  6. Nginx的反向代理的配置
  7. Python制作反编译APK工具
  8. 非线性视频编辑软件百科全书式介绍
  9. 软件测试 -- 软件缺陷记录的5C原则
  10. 数据库迁移工具flyway
  11. Towards a Theory of Accountability and Audit
  12. 什么是Numpy、Numpy教程
  13. FPGA零基础学习:理解数字信号和模拟信号
  14. JPinyin繁体相互转换
  15. 不忘初心Windows11精简版
  16. Reason: Cannot pass null or empty values to constructor in spring security
  17. Amazon亚马逊卖家设置World First(WF卡)收款教程!
  18. 【Java二十周年】我的JAVA小时代
  19. 北京科技大学材料与化工专业(专硕)考研上岸经验分享
  20. Windows10安装Mac OS系统

热门文章

  1. 在计算机领域中图形用户界面,带图形用户界面的计算机
  2. 临近服务直接发现和通信的授权与撤回
  3. 阿里技术leader:哪有什么天生的领导力,不过是后期不断磨练罢了
  4. 嵌入式开发为什么用C语言
  5. XSS漏洞的原理与测试解决方案笔记
  6. design compiler
  7. 中电科45家研究所:北上第一梯队,南京、成都、合肥和重庆第二梯队
  8. 夏季咽喉肿痛,上火原因和治疗途径
  9. 想练八段锦?扔掉可爱漫画版吧,现在出真人教练版了!
  10. 想学习C语言?这里有非常实用的C语言技巧,进来看看吧!