「作者简介」:2022年北京冬奥会中国代表队,**** Top100,学习更多干货,请关注专栏《网络安全自学教程》
SSL协议
- 1、SSL协议发展史
- 2、SSL协议执行过程
- 3、SSL报文格式字段解析
- 3.1、TLS报文头
- 3.2、Handshake报文
- 4、Wireshark抓包分析SSL协议执行原理
- 4.1、Client Hello
- 4.2、Server Hello
SSL(Secure Socket Layer)是「安全套接层协议」,在握手过程中使用非对称秘钥加密实现数据的机密性;使用哈希算法实现数据的完整性。
1、SSL协议发展史
SSL3.1开始名字改成了TLS,TLS在SSL的基础上进行了「标准化」,实际上两个协议的功能没有明显的差距。
SSL1.0 | SSL2.0 | SSL3.0 | SSL3.1 | SSL3.2 | SSL3.3 | SSL3.4 |
---|---|---|---|---|---|---|
TLS1.0 | TLS1.1 | TLS1.2 | TLS1.3 | |||
内部 | 弃用 | 弃用 | 可用 | 可用 | 主流 | 可用 |
- SSL1.0:网景(Netscape)公司开发的第一个版本,由于存在严重bug,仅在内部使用。
- SSL2.0:1995年2月发布,存在安全漏洞,于2011年弃用。
- SSL3.0:1996年发布,容易被POODLE攻击,与2015年弃用。
- TLS1.0:1999年发布,IETF组织在SSL基础上进行了标准化,功能变化不大。
- TLS1.1:2006年4月发布,修复了安全漏洞,增加加密强度。
- TLS1.2:2008年8月发布,强化了支持的算法包,增加了扩展协议,是目前使用的主流版本。
- TLS1.3:2018年8月发布,在强化安全性的同时,引入了0-RTT模式,降低了传输延迟,增强了传输性能
2、SSL协议执行过程
SSL协议分为两层:
- 第一层是「SSL记录协议」(SSL Record Protocol),工作在传输层协议之上,为高层协议封装、压缩、「加密数据」。
- 第二层是「SSL握手协议」(SSL Handshake Protocol),工作在记录协议之上,在数据传输前通过握手的方式验证身份、「协商加密算法」。
补充:第二层一共有4种子协议,多个子协议信息可以包含在一个记录协议的数据包里,但必须标识出来。除了握手协议还有三个需要了解的协议:密码参数协议、警报协议、应用数据协议。
- 密码参数协议(ChangeCipherSpec Protocol):这个协议很简单,简单到只有一条消息,就是发出激活加密的信号,让之前协商的参数生效,从而让通信变得加密。
- 警报协议(Alert Protocol):提示异常或可能危及安全性的潜在为题。
- 应用数据协议(Application Data Protocol):获取应用层的数据并加密传输。
SSL协议执行的时候分为两个阶段:
- 第一个是「握手阶段」,通信双方使用SSL握手协议协商加密算法和密钥。
- 第二个是「数据传输阶段」,使用握手阶段协商的算法加密并传输数据。
SSL协议的握手过程如下图
接下来我们详细讲解每个握手阶段作用:
- Client Hello :客户端把支持的加密算法列表发给服务器。
- Server Hello :服务器从列表里选择一个加密算法,然后告诉客户端。
- Certificate :服务器把自己的证书发给客户端。
- Server Key Exchange :服务器跟客户端约定对称密钥算法的密钥。如果使用Diffie-Hellman方式约定密钥,则必选;如果使用RSA方式约定密钥,则省略。
- Server Hello Done :告诉客户端 “我发完了”。
- Client Key Exchange:客户端跟服务器约定对称密钥算法的密钥。如果使用Diffie-Hellman方式约定密钥,则发送必要的信息给服务器,让服务器和客户端生成同一个密钥;如果使用RS方式约定密钥,则生成一个对称密钥算法的密钥,用服务器的公钥加密后,发送给服务器。
- ChangeCipherSpec:客户端告诉服务器 “你可以使用加密模式了”。
- Encrypted Handshake Message:也叫Finished,客户端告诉服务器 “我准备好加密通信了”。
- ChangeCipherSpec:服务器告诉客户端 “你可以使用加密模式了”。
- Encrypted Handshake Message:也叫Finished,服务器告诉客户端 “我准备好加密通信了”。
上面的过程是单向认证模式,比较常见;如果使用双向认证模式,握手还会增加以下过程:
- Certificate Request (可选):开启双向认证模式,即客户端验证服务器,服务器也要验证客户端。https的网站很少用,一般抓不到这个包。
- Certificate(可选):发送客户端的证书给服务器。只有收到 Certificate Request 才发,否则不发这个报文。
- Certificate Verify (可选):把客户端的签名发给服务器,服务器用客户端的公钥验证签名,从而验证客户端的身份。只有收到 Certificate Request 才发,否则不发这个报文。
3、SSL报文格式字段解析
3.1、TLS报文头
每个TLS的数据包都有5个字节的报文头(下图圈中的地方):
- Content Type:1个字节,记录的子协议的协议类型。
- Version:2个字节,TLS的版本。
- Length:2个字节,报文数据的长度(不含报文头),最大16384(16K)。
3.2、Handshake报文
Handshake 握手协议是TLS中最复杂的协议,有10种握手消息类型。
1)HelloRequest:(不常见)连接使用太长时间后,服务器强制客户端重新协商握手。
- Content Type:握手类型。
- Length:(3个字节)数据长度。
2)Client Hello:开始握手协商,携带客户端支持的加密算法列表、压缩算法列表、扩展列表,供服务器选择。
- Content Type:握手类型。
- Lengt:(3个字节)数据长度。
- Version:(4个字节)协议版本。
- Random:(32位)客户端生成一个随机数,用于后续的对称加密。
- Session ID Lenth:(1个字节)会话ID长度。
- Session ID:(32位)会话ID。
- Cipher Suites:客户端支持的加密算法列表,供服务器选择。
- Compression Methed:客户端支持的压缩算法,供服务器选择。
- Extensions:扩展。
3)Server Hello:开始握手协商,返回服务器选择的加密算法、压缩算法。
- Content Type:握手类型。
- Lengt:(3个字节)数据长度。
- Version:(4个字节)协议版本。
- Random:(32位)服务器生成一个随机数,用于后续的对称加密。
- Session ID Lenth:(1个字节)会话ID长度。
- Session ID:(32位)会话ID。
- Cipher Suites:服务器选择的加密算法。
- Compression Methed:服务器选择的压缩算法。
- Extensions:扩展。
4)Certificate:发送公钥证书列表。
- Content Type:握手类型。
- Lengt:(3个字节)数据长度。
- Certificates Length:证书列表长度。
- Certificates:证书列表。
5)ServerKeyExchange:发送服务器的密钥交换算法参数,用于后续的对称加密。
- Content Type:握手类型。
- Lengt:(3个字节)数据长度。
- algorithm params:算法参数。
6)CertificateRequest:服务器验证客户端身份,不常见。
- Content Type:握手类型。
- Lengt:(3个字节)数据长度。
- Certificate Type Length:证书类型长度。
- Certificate Type:证书类型。
- Certificate Authorities length:认证中心长度。
- Certificate Authorities:认证中心。
7)ServerHelloDone:服务器完成握手协商时发送。只提示,不携带其他信息。
- Content Type:握手类型。
- Lengt:(3个字节)数据长度。
8)ClientKeyExchange:为服务器提供密钥交换算法参数,用于生成对称加密的密钥。
- Content Type:握手类型。
- Lengt:(3个字节)数据长度。
- algorithm params:算法参数。
9)CertificateVerify:客户端使用此消息来证明服务器拥有与其公钥证书相对应的私钥。该消息保存由客户端进行数字签名的哈希信息。
- Content Type:握手类型。
- Lengt:(3个字节)数据长度。
- signed hash:客户端数字签名的哈希信息。
10)Finished:也叫Encrypted Handshake Message,标识握手协商已完成、CipherSuite加密已激活。从这个报文开始加密发送,报文携带先前所有握手信息的哈希值,用来验证数据的完整性,防止数据被篡改。
- Content Type:握手类型。
- Lengt:(3个字节)数据长度。
- signed hash:先前所有握手信息的哈希值。
4、Wireshark抓包分析SSL协议执行原理
1)cmd 中 ping weibo.com
获取微博IP;
ping返回的地址有时会变,用 nslookup weibo.com
解析微博的IP;
解析列表中的4个IP,我们都抓,以防IP变动导致没抓到包。
2)打开wireshark,过滤微博的IP _ws.col.protocol == "TLSv1.2" and (ip.addr==123.125.107.13 or ip.addr==123.125.107.14 or ip.addr==202.108.0.99 or ip.addr==202.108.0.98)
后,开启抓包,访问微博。
3)从抓包结果可以看出来,前几个包是握手,握手完成以后才开始传数据。
4)握手有10个过程,一个数据包可以包含多个握手过程,比如第三个包,就同时包含了Certificate、Server Key Exchange、Server Hello Done三个过程。
4.1、Client Hello
第一个包是我给微博发的 Client Hello,意思是我要开始握手协商了。
Handshake Type 是握手类型,这里的类型是Client Hello。
Length 和 Version是数据包长度和协议版本。
Random 是客户端生成的随机数,用来生成对称密钥。
Session ID 是会话ID,短期内重复连接时,会话可以复用。
Cipher Suites 是客户端支持的加密算法,服务器可以从这个列表里选择它认为最安全的一个算法,后续用来加密数据。
Compression Methods 是客户端支持的压缩算法。
Extensions 是一些扩展。
4.2、Server Hello
第二个包是微博给我返回的 Server Hello,意思是它也要跟我开始握手,协商加密参数。
Cipher Suite是服务器选择的加密算法,握手完成后会用这个算法加密数据。
Compression Method 是服务器选择的压缩算法,这里是null,说明没选,数据不被压缩。