TLS(Transport Layer Security, 传输层安全):用于保证Web通信以及其他流行协议的安全。
TLS的前身是安全套接字层(SSL)。
TLSv1.2版本运行在面向流的协议(如TCP)之上。
记录协议提供分片、压缩、完整性保护以及对客户端与服务器之间所交换数据的加密服务。
信息交换协议负责建立身份,进行认证,提示警报,以及为用于每一条连接的记录协议提供唯一的密钥材料。
TLS记录协议:负责识别不同的消息类型,以及每条消息的完整性,安全性验证。
记录协议提供了一个可扩展的记录内容类型值集合来来识别高层协议。
**记录协议的处理流程:**先将应用层信息块(分片)划分为TLS明文记录(最长16K)。TLS明文记录形成后就会使用一种压缩算法进行压缩(通常是NULL压缩协议),形成TLS压缩结构。
为了防止数据被修改,加密与完整性保护算法会把TLS压缩结构转换为能在底层传输层上传输的TLS密文结构。
过程如下:
TLS信息交换协议:密码变更协议、警告协议、握手协议。
密码变更协议:指出通信一方希望将当前状态修改为挂起状态。
警告协议:传递状态信息。
握手协议:建议与连接相关的运行参数。它允许端点完成以下目标:
1、协议加密算法并交换形成对称密钥时使用的随机值。
2、建立算法运行参数。
3、交换证书并执行互相谁。(通常是单向认证)
4、生成特定的会话密钥。
5、为记录层提供安全参数。
6、验证所有的操作都已正确执行。握手过程:
以下对握手过程进行抓包:
先建立TCP连接(三次握手)
ClientHello包
141号包:
其中的Random Bytes是客户端生成的28字节的随机数,用于生成最终的会话密钥,后面的过程还会传递两个随机数,三个随机数做为EC Diffie-Hellman算法的相关参数,运算出会话密钥。先把这个随机数称为random_c.
ServerHello
服务器也生成了一个随机数发给了客户端,此时客户端与服务器各拥有两个相同的随机数。random_c, random_s。
压缩算法为NULL压缩算法。(不支持任何压缩算法)
服务器返回了两个证书: 第一个是百度的证书,另一个应该是根证书。 客户端收到这个证书后,可以根据证书链来验证证书的真伪,进而判断服务器是真是假。 服务器证书中存放一个公钥,用于加密后面生成的Premaster secret
ServerKeyExchange
ServerKeyExchange(服务器密钥交换消息)
:仅用于服务器发送的Certificate消息没有足够的信息让客户端来生成Premaster secret的情况(如密码套件以TLS_DHS_anon, TLS_DHE_DSS, TLS_DHE_RSA开头的),本次服务器选择的密码套件需要发送ServerKeyExchange消息来生成Permaster secret。(预置密钥)
此消息中服务器向客户端发送了Pubkey这个随机数。 此时客户端已经拥有了三个随机数(自身生成的random_c, 服务器发送的random_s以及此处的pubkey),有了这三个参数,就可以运行Diffie-Hellman算法生成Premaster secret(最终 的会话密钥)
表示服务器这边握手相关的信息发送完毕。(但客户端的消息还没发送完,比如生成最终会话密钥所需要的三个随机数,此时服务器只有两个(random_c, random_s))
三种消息一起发送, ClientKeyExchange同ServerKeyChange,客户端向服务器发送pubkey这个随机数。(现在服务器有了三个随机数)
ChangeCipherSpec 表示以后客户端要使用加密的方式发送数据。
Encrypted Handshake Message (Finished)