主页


引言

本文主要内容涉及到TLS协议发展历程、TLS协议原理以及在HTTPS中的应用,以希望读着对TLS协议的基本工作原理和实际应用有个基本认识。


背景

我们在访问网站的时候经常会碰到以下两种情况:

  • 网站1:

  • 网站2:

从图中可以看到:网站1地址前面显示不安全字样,网站2前面显示的字样,这两种网站本质区别在于有没有使用TLS协议进行通信保护。

浏览器正式通过这种方式提醒用户访问的网站是否安全,通信消息是否会被窃听。

注:上图使用的浏览器为chrome浏览器,其他浏览器可能稍有差别。


发展历程

TLS协议:(Transport Layer Security)是用来保证网络通信安全密码学协议。被广泛应用在电子邮件、即时通信、VoIP以及HTTPS协议中,其中HTTPS最为常见。TLS协议能够保证通信消息的隐私性消息完整性以及通信实体的身份鉴别


TLS协议(前身SSL)从1986左右开始,经过了多个版本的发展(以下图片来自维基百科):

  • SSL协议作为TLS的前身,由于存在诸多安全漏洞,已经在2015全部被废弃.
  • TLS协议也经过了多个版本的迭代,其中TLS1.0和TLS1.1由于在协议中使用了MD5、SHA-1等因素,在2021年相继被废弃
  • TLS1.2解决了之前版本的安全问题。已成为使用最广泛的TLS协议,据统计99%以上的网站支持了TLS1.2
  • TLS1.3移除了不安全的密码算法,并在密码算法支持握手效率上等方面进行了显著优化。

协议原理

网络通信模型

在介绍TLS协议原理前,我们首先了解下,网络安全通信模型

  • 无TLS协议保护

  • 有TLS协议保护

从上图中我们可以看到,在网络通信过程中,如果未使用tls保护,会存在通信消息被窃听篡改的风险,同时攻击者可以伪造身份进行通信;而使用了TLS协议,能够保证消息的隐私性完整性和通信实体身份实体的真实性

注:在访问网站的场景中,这里的AliceBobEve可以理解为浏览器Web网站网络攻击者

TLS协议原理

TLS协议离不开密码技术的支持,密码技术贯穿TLS协议流程的各个环节,其中:

  • 隐私性离不开对称加密,如AES、DES、SM4算法等
  • 完整性离不开哈希函数, 如SHA256、SHA384、SM3等
  • 身份鉴别非对称算法,如RSA、ECC、SM2等

TLS协议包含多个子协议

  • 应用数据协议(Application Data Protocol): 用于密文传输
  • 告警协议(Alert Protocol):在TLS连接中,如果发生了错误或异常情况,TLS协议会使用Alert Protocol发送警报信息,以通知对方发生了什么问题。
  • 握手协议(Handshake Protocol):用于密钥协商
  • 更改密码规范协议(Change Cipher Spec Protocol): 在TLS连接中通知对方加密算法已经切换
  • 记录协议(Record Protocol): 在TLS连接中对数据进行分段、压缩、加密和认证。上面4个子协议的数据都会通过Record Protocol进行处理,然后再通过网络传输。

TLS协议的核心是TLS握手协议,握手流程如下:

TLS握手过程中客户端和服务端会进行多轮交互,交互过程中会发送握手协议包(下文描述中我们称为xx消息)

上图中标*的部分根据场景为可选,如:

  • 双向认证中,server发送CertificateRequest消息, 客户端响应Certificate消息和CertificateVerify消息(服务端使用这两个消息验证客户端身份)
  • 会话恢复非首次建立TLS链接)中,图中标*的消息不参与握手流程
  • []ChangeCipherSpec协议不属于握手流程传递的消息,而是通过Change Cipher Spec Protocol规定的消息格式进行发送。

下面我们以服务器单向认证为例,介绍TLS握手协议的详细流程:


  1. Client Hello

    客户端向服务端发送ClientHello消息,消息内容包括:

    • 支持的TLS版本
    • 32字节的随机数(客户端生成,用于生成主密钥master key)
    • 会话ID
    • 加密套件
    • 压缩算法

  1. Server Hello

    服务器根据收到的ClientHello消息内容以及本地支持的TLS版本加密套件确定本次通信的SSL版本加密套件,并通过ServerHello消息通知给客户端, 消息内容包括:

    • 服务端采纳的本次通讯的TLS版本
    • 32字节的随机数(服务端生成, 用于生成主密钥master key)
    • 会话ID
    • 服务端采纳的用于本次通讯的加密套件, (从ClientHello加密套件中选择一个双方都支持的)
    • 压缩算法

  1. Certificate

    服务器将服务端数字证书证书链通过Certificate消息发送给客户端,客户端基于该消息:

    • 检查服务端数字证书的证书链,验证服务端身份
    • 如果密钥协商算法为rsaKeyAgreement,则使用服务端数字证书中携带的服务端公钥预备主密钥进行加密。

  1. Server Key Exchange

    密钥交换阶段(可选步骤),只有在新建会话并使用ecdh密钥协商时有效,该消息包含服务端密钥协商DH参数,如下:

    • ecdh密钥协商使用的密码算法
    • 基于密码算法所生成的临时公钥(用于生成主密钥)

  1. Server Hello Done

    服务器发送ServerHelloDone消息,通知客户端版本和加密套件协商结束

  1. Client Key Exchange

    客户端验证服务器证书合法后,将客户端密钥协商部分通过ClientKeyExchange消息发送给服务器, 消息内容包括:

    • 如果密钥协商为rsaKeyAgreement, 则为主密钥密文(客户端从服务端发送的Certificate消息中提取服务端公钥,对pre master secret进行加密获得)
    • 如果密钥协商为ecdhKeyAgreement, 则为客户端DH参数。

该消息发送成功后,客户端和服务端,都得到了完整的主密钥:

  • 如果密钥协商为rsaKeyAgreement, 服务端使用自己的私钥解密收到的ClientKeyExchange消息携带的主密钥密文
  • 如果密钥协商为ecdhKeyAgreement, 服务端和客户端运行DH算法,根据服务端DH参数客户端DH参数, 计算得到。

  1. Change Cipher Spec

    客户端发送ChangeCipherSpec消息,通知服务器后续报文将采用协商好的主密钥和加密套件进行密文通信

  1. Finished

    客户端基于交互过程中收到的服务端握手消息,计算Hash值,并使用协商好的密钥加密套件进行加密,通过Finished消息发送给服务器。服务端进行解密和验证。

  1. Change Cipher Spec

    SSL服务器发送ChangeCipherSpec消息,通知客户端后续报文将采用协商好的密钥和加密套件进行密文通信

  1. Finished

    服务端基于交互过程中收到的客户端握手消息,计算Hash值,并使用协商好的密钥加密套件进行加密,通过Finished消息发送给客户端。

    客户端收到后进行解密和验证。协议执行到这里,表明客户端和服务端密钥协商成功。

  1. Application Data

    客户端和服务端交互使用密文进行通信,保证了通信消息的隐私性

wireshark抓包解析

wireshark下载传送门:https://www.wireshark.org/

wireshark是一款比较优秀的网络协议分析软件,常用于网络抓包网络协议分析


下面我们以访问某知名大学网站,通过网络抓包详细分析下TLS协议流程

图一:概览图

从图一抓包结果我们可以了解到:

  1. 使用的TLS版本为TLSv1.2
  2. 握手过程中的关键字有:
    - Client Hello
- Server Hello
- Certificate, Server Key Exchange, Server Hello Done
- Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
- New Session Ticket, Change Cipher Spec, Encrypted Handshake Message
- Application Data

图二:客户端 -> 服务端:Client Hello

从上图可以看到:

  1. 握手协议消息类型为Client Hello
  2. 客户端支持的TLS版本为TLS 1.2 (0x0303), 其中0x0303为内部版本号,如TLS1.3为0x0304
  3. 客户端生成的32字节随机数
  4. 客户端支持的加密套件,优先级从上到下。

图三:服务端 -> 客户端:Server Hello

从上图可以看到:

  1. 握手协议消息类型为Server Hello
  2. 服务端确定的TLS版本为TLS 1.2
  3. 服务端生成的32字节随机数
  4. 服务端确定的加密套件TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,该加密套件各字段用途如下:


图四:服务端 -> 客户端:Certificate, Server Key Exchange, Server Hello Done

从上图可以了解到,本次通信tcp包携带了3个tls握手协议包:

  1. Certificate消息:

    • 1.1服务端证书,id-at-commonName=*.pku.edu.cn"表示为北京大学服务器网站
    • 1.2证书链,该证书链包含根证书id-at-commonName=DigiCert Global Root CA, 该根CA为知名签发机构(隶属于美国)
  2. Server Key Exchange消息:
  • 2.1 服务端DH参数,参与生成主密钥
  • 2.2 服务端签名,用于验证消息有效性
  1. Server Hello Done消息:通知客户端加密套件协商结束

图五:客户端 -> 服务端:Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message

从上图可以了解到,本次通信tcp包携带了3个tls握手协议包:

  1. Client Key Exchange消息

    • 1.1 客户端DH参数,参与生成主密钥
  2. Change Cipher Spec消息:通知服务端,客户端已准备好进行密文通信
  3. Encrypted Handshake Message消息:同Finished消息(密文形式)

图六:服务端 -> 客户端: New Session Ticket, Change Cipher Spec, Encrypted Handshake Message

从上图可以了解到,本次通信tcp包携带了3个tls协议包:

  1. New Session Ticket消息: 服务器在TLS握手过程中生成一个新的会话票据(Session Ticket),并将其发送给客户端。客户端可以在后续的TLS握手中使用该会话票据来恢复之前的会话状态,从而避免了重新进行完整的TLS握手流程,提高了握手的效率和安全性。
  2. Change Cipher Spec消息:通知客户端,服务端已准备好进行密文通信
  3. Encrypted Handshake Message消息:同Finished消息(密文形式)

图七:客户端 <-> 服务端:Application Data

从上图可以看到:

  1. 该消息不属于TLS握手协议,属于Application Data Protocol,是TLS协议的另一个子协议。
  2. Encrypted Application Data: 所有应用数据都被加密传输。

结论

本文主要介绍了TLS协议发展历程、TLS协议原理以及在HTTPS中的应用,并在最后通过wireshark对TLS网络协议进行了详细的抓包分析。

TLS协议在网络安全通信中具有重要应用,可以说网络安全离不开TLS协议的支持,理解TLS协议原理对于建设安全网站编写安全网络程序

以及防止数据泄露等方面具有重要意义。


展望

本文详细介绍了TLS1.2协议,但未涉及到TLS1.3协议的相关内容,TLS1.3在安全性握手性能以及扩展性上做了进一步优化,后续会单独通过另一篇文档进行详细介绍。


参考资料


————————————————

版权声明:本文为博客园博主「warm3snow」的原创文章,转载请附上原文出处链接及本声明。

原文链接:https://www.cnblogs.com/informatics/

TLS详解(原理和实践)的更多相关文章

  1. Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)

    Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践) 相关文章:Gradio入门到进阶全网最详细教程[一]:快速搭建AI算法可视化部署演示(侧重项目搭建 ...

  2. Dockerfile 命令详解及最佳实践

    Dockerfile 命令详解 FROM 指定基础镜像(必选) 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制.就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指 ...

  3. SATB的标记问题解决之道与G1垃圾收集模式系统详解及最佳实践

    继续接着上一次https://www.cnblogs.com/webor2006/p/11148282.html的理论学习,上一次学习到了这: 接着继续: SATB详解: 对于三色算法在concurr ...

  4. Docker网络详解——原理篇

    安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络). none .host 网络模式 简介 Host 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP ...

  5. Docker笔记(十一):Dockerfile详解与最佳实践

    Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...

  6. TLS详解

    TLS加密通信, 开始使用协商的秘钥进行加密通信 1.服务器也可以要求验证客户端,即实现双向的验证, 2.会话缓存握手过程,为了建立握手的速度,减少协议带来的性能方面的降低和资源方面的消耗,TLS协议 ...

  7. android 开发 View _14 MotionEvent和事件处理详解,与实践自定义滑动条View

    转载https://blog.csdn.net/huaxun66/article/details/52352469 MotionEvent MotionEvent对象是与用户触摸相关的时间序列,该序列 ...

  8. 《Exploring in UE4》多线程机制详解[原理分析]

    转自:https://zhuanlan.zhihu.com/c_164452593 目录一.概述二."标准"多线程三.AsyncTask系统3.1 FQueuedThreadPoo ...

  9. CSS UNIT 详解以及最佳实践

    分类 ■    绝对长度(Absolute units):cm,mm,in,pt,pc 绝对单位之间的换算:1in = 2.54cm=25.4mm=72pt=6pc 绝对长度在css中的表现和其他地方 ...

  10. 利用jquery对ajax操作,详解原理(附代码)

    1. jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selecto ...

随机推荐

  1. 【Avalonia】【跨平台】关于控件阴影简单用法

    背景 当我们在用Avalonia开发项目时,我们可能会对控件添加一些阴影效果,改善用户体验,我们开发WPF的人知道,WPF会给我提供Effect这么一个属性,这是方便我们进行阴影以及特效使用,但是Av ...

  2. Wiki.js配置LDAP认证

    安装好wikijs 之后, 可以进行进一步的详细配置. 这里介绍 LDAP 认证的配置. 在 管理 -> 身份验证 -> 添加策略 -> 选择 LDAP/AD , 如下: 接下来进行 ...

  3. 图与网络分析—R实现(三)

    最小生成树 (Minimum Spanning Tree) 应该大家都不陌生,Spanning 有跨越的意思,生成树一般来说每个节点都能访问到别的节点,是一个连通树.所以,一般考虑无向图里去造生成树. ...

  4. tar:Error is not recoverable:exiting now

    问题描述:文件包在不同网络跟介质之间传输,导致文件破损,如何使用md5的方式去对比文件的完整性 tar:Child returned status 1 tar:Error is not recover ...

  5. day02-2-商铺查询缓存

    功能02-商铺查询缓存 3.商铺详情缓存查询 3.1什么是缓存? 缓存就是数据交换的缓冲区(称作Cache),是存储数据的临时地方,一般读写性能较高. 缓存的作用: 降低后端负载 提高读写效率,降低响 ...

  6. 记一次 .NET 某外贸ERP 内存暴涨分析

    一:背景 1. 讲故事 上周有位朋友找到我,说他的 API 被多次调用后出现了内存暴涨,让我帮忙看下是怎么回事?看样子是有些担心,但也不是特别担心,那既然找到我,就给他分析一下吧. 二:WinDbg ...

  7. Typecho<=1.2.0 存储型XSS 复现

    Typecho<=1.2.0 存储型XSS 影响版本 漏洞影响版本:Typecho <= 1.2.0 漏洞复现 cookie.js // 定义一个全局变量 website,值为一个具体的网 ...

  8. 访问nginx报错502日志:failed (13: Permission denied) while connecting to upstream

    1.错误问题 nginx启动成功,但是访问nginx报错502.检查后台项目,使用IP+端口可以正常访问项目的,这说明项目启动成功了.那就是nginx的问题.检查了nginx.conf文件发现配置的反 ...

  9. 深度学习-07(图像分类、常用数据集、利用CNN实现图像分类、图像分类优化)

    文章目录 深度学习-07(PaddlePaddle图像分类) 图像分类概述 概述 什么是图像分类 图像分类粒度 图像分类发展历程 图像分类问题的挑战 常用数据集介绍 MNIST数据集 CIFAR10数 ...

  10. #Python 利用pandas 合并csv/xlsx文件

    上次我们分享了利用powerquery来合并文件进行数据分析,但是Pq有一部分局限性,在现实工作中,我们往往需要合并多个文件去处理数据, 如果面对20个甚至更多的文件,pq中的每一步的步骤都会去读取每 ...