TLS详解(原理和实践)
主页
- 个人微信公众号:密码应用技术实战
- 个人博客园首页:https://www.cnblogs.com/informatics/
引言
本文主要内容涉及到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协议,能够保证消息的隐私性、完整性和通信实体身份实体的真实性。
注:在访问网站的场景中,这里的Alice、Bob和Eve可以理解为浏览器、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握手协议的详细流程:
- Client Hello
客户端向服务端发送ClientHello消息,消息内容包括:- 支持的TLS版本
- 32字节的随机数(客户端生成,用于生成主密钥
master key) - 会话ID
- 加密套件
- 压缩算法
- Server Hello
服务器根据收到的ClientHello消息内容以及本地支持的TLS版本和加密套件确定本次通信的SSL版本和加密套件,并通过ServerHello消息通知给客户端, 消息内容包括:- 服务端采纳的本次通讯的
TLS版本 - 32字节的随机数(服务端生成, 用于生成主密钥
master key) - 会话ID
- 服务端采纳的用于本次通讯的
加密套件, (从ClientHello加密套件中选择一个双方都支持的) - 压缩算法
- 服务端采纳的本次通讯的
- Certificate
服务器将服务端数字证书和证书链通过Certificate消息发送给客户端,客户端基于该消息:- 检查
服务端数字证书的证书链,验证服务端身份 - 如果密钥协商算法为
rsaKeyAgreement,则使用服务端数字证书中携带的服务端公钥对预备主密钥进行加密。
- 检查
- Server Key Exchange
密钥交换阶段(可选步骤),只有在新建会话并使用ecdh密钥协商时有效,该消息包含服务端密钥协商DH参数,如下:- ecdh密钥协商使用的密码算法
- 基于密码算法所生成的临时公钥(用于生成主密钥)
- Server Hello Done
服务器发送ServerHelloDone消息,通知客户端版本和加密套件协商结束
- Client Key Exchange
客户端验证服务器证书合法后,将客户端密钥协商部分通过ClientKeyExchange消息发送给服务器, 消息内容包括:- 如果密钥协商为
rsaKeyAgreement, 则为主密钥密文(客户端从服务端发送的Certificate消息中提取服务端公钥,对pre master secret进行加密获得) - 如果密钥协商为
ecdhKeyAgreement, 则为客户端DH参数。
- 如果密钥协商为
该消息发送成功后,客户端和服务端,都得到了完整的主密钥:
- 如果密钥协商为
rsaKeyAgreement, 服务端使用自己的私钥解密收到的ClientKeyExchange消息携带的主密钥密文 - 如果密钥协商为
ecdhKeyAgreement, 服务端和客户端运行DH算法,根据服务端DH参数和客户端DH参数, 计算得到。
- Change Cipher Spec
客户端发送ChangeCipherSpec消息,通知服务器后续报文将采用协商好的主密钥和加密套件进行密文通信。
- Finished
客户端基于交互过程中收到的服务端握手消息,计算Hash值,并使用协商好的密钥和加密套件进行加密,通过Finished消息发送给服务器。服务端进行解密和验证。
- Change Cipher Spec
SSL服务器发送ChangeCipherSpec消息,通知客户端后续报文将采用协商好的密钥和加密套件进行密文通信
- Finished
服务端基于交互过程中收到的客户端握手消息,计算Hash值,并使用协商好的密钥和加密套件进行加密,通过Finished消息发送给客户端。
客户端收到后进行解密和验证。协议执行到这里,表明客户端和服务端密钥协商成功。
- Application Data
客户端和服务端交互使用密文进行通信,保证了通信消息的隐私性
wireshark抓包解析
wireshark下载传送门:https://www.wireshark.org/
wireshark是一款比较优秀的网络协议分析软件,常用于网络抓包和网络协议分析。
下面我们以访问某知名大学网站,通过网络抓包详细分析下TLS协议流程。
图一:概览图
从图一抓包结果我们可以了解到:
- 使用的TLS版本为TLSv1.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
从上图可以看到:
- 握手协议消息类型为
Client Hello - 客户端支持的TLS版本为
TLS 1.2 (0x0303), 其中0x0303为内部版本号,如TLS1.3为0x0304。 - 客户端生成的32字节
随机数 - 客户端支持的
加密套件,优先级从上到下。
图三:服务端 -> 客户端:Server Hello
从上图可以看到:
- 握手协议消息类型为
Server Hello - 服务端确定的TLS版本为
TLS 1.2 - 服务端生成的32字节
随机数 - 服务端确定的
加密套件为TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,该加密套件各字段用途如下:

图四:服务端 -> 客户端:Certificate, Server Key Exchange, Server Hello Done
从上图可以了解到,本次通信tcp包携带了3个tls握手协议包:
- Certificate消息:
- 1.1服务端证书,
id-at-commonName=*.pku.edu.cn"表示为北京大学服务器网站 - 1.2证书链,该证书链包含根证书
id-at-commonName=DigiCert Global Root CA, 该根CA为知名签发机构(隶属于美国)
- 1.1服务端证书,
- Server Key Exchange消息:
- 2.1 服务端DH参数,参与生成主密钥
- 2.2 服务端签名,用于验证消息有效性
- Server Hello Done消息:通知客户端加密套件协商结束
图五:客户端 -> 服务端:Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
从上图可以了解到,本次通信tcp包携带了3个tls握手协议包:
- Client Key Exchange消息
- 1.1 客户端DH参数,参与生成主密钥
- Change Cipher Spec消息:通知服务端,客户端已准备好进行密文通信
- Encrypted Handshake Message消息:同Finished消息(密文形式)
图六:服务端 -> 客户端: New Session Ticket, Change Cipher Spec, Encrypted Handshake Message
从上图可以了解到,本次通信tcp包携带了3个tls协议包:
- New Session Ticket消息: 服务器在TLS握手过程中生成一个新的会话票据(Session Ticket),并将其发送给客户端。客户端可以在后续的TLS握手中使用该会话票据来恢复之前的会话状态,从而避免了重新进行完整的TLS握手流程,提高了握手的效率和安全性。
- Change Cipher Spec消息:通知客户端,服务端已准备好进行密文通信
- Encrypted Handshake Message消息:同Finished消息(密文形式)
图七:客户端 <-> 服务端:Application Data
从上图可以看到:
- 该消息不属于TLS握手协议,属于
Application Data Protocol,是TLS协议的另一个子协议。 - Encrypted Application Data: 所有应用数据都被加密传输。
结论
本文主要介绍了TLS协议发展历程、TLS协议原理以及在HTTPS中的应用,并在最后通过wireshark对TLS网络协议进行了详细的抓包分析。
TLS协议在网络安全通信中具有重要应用,可以说网络安全离不开TLS协议的支持,理解TLS协议原理对于建设安全网站,编写安全网络程序
以及防止数据泄露等方面具有重要意义。
展望
本文详细介绍了TLS1.2协议,但未涉及到TLS1.3协议的相关内容,TLS1.3在安全性、握手性能以及扩展性上做了进一步优化,后续会单独通过另一篇文档进行详细介绍。
参考资料
————————————————
版权声明:本文为博客园博主「warm3snow」的原创文章,转载请附上原文出处链接及本声明。
原文链接:https://www.cnblogs.com/informatics/