文章目录
- 1. TCP三次握手机制
- 2. HTTP Request 请求报文
- 3. HTTP Response 响应报文
- 4. SSL/TLS协议
- 4.1. ClientHello 客户端Hello报文
- 4.2 ServerHello 服务器Hello报文
- 4.3. *ServerKeyExchange 服务公钥交换
- 4.4. ClientKeyExchange 客户端公钥交换
- 4.5. *CertificateVerify 证书验证报文
- 4.6. ChangeCipherSpec 更改密钥规格
- 4.7. Application Data 应用数据报文
- 4.8. fnished 传输结束报文
本文主要解析 TCP -> HTTP -> SSL/TLS 交互过程中的数据包详细信息。
1. TCP三次握手机制
Client使用随机端口请求Server的HTTP服务80端口(序号1、2、5);
2. HTTP Request 请求报文
当TCP连接建立完成后,Client发送HTTP请求服务端资源,服务器收到请求后会回复ACK(序号7、8);
请求类型:
- GET:参数携带位置在URI处;
- POST:参数携带位置在正文处;
- PUT:更新资源;
- DELETE:删除资源;
结尾标识:
- \r\n:字段结尾标识符。
3. HTTP Response 响应报文
当服务器收到HTTP合理且符合规范的请求后,会做出响应,转发到Client;
4. SSL/TLS协议
SSL/TLS是一个安全通信框架,上面可以承载HTTP协议或者SMTP/POP3协议等(本次以TLS 1.0协议为案例做描述讲解)。协议握手过程如下:
本文部分报文图片来源于网络,其中169.254.255.66
为客户端,169.254.100.98
为服务器。
4.1. ClientHello 客户端Hello报文
Client向Server发送一个Hello信息(包26),包含其:可用版本号、当前时间(位于随机数字段下)、客户端随机数(防伪造)、会话ID(会话保持机制)、可用的加算法清单、可用的压缩方式清单;
常见的12种加密算法:
扩展内容:
4.2 ServerHello 服务器Hello报文
Server收到Client的Hello报文后,会向客户端回复一个Hello消息(包27),包含其服务侧的信息:使用的版本号、当前时间、服务器随机数、会话ID、使用的加密算法、使用的压缩方式、CA证书;
Certificate CA证书:服务侧需要发送自己的证书清单,证书可能是层级结构的,因此除了服务侧本身的证书外还需要提供为服务侧签名的证书,用来证明服务器的合法性。
4.3. *ServerKeyExchange 服务公钥交换
若服务侧的CA证书信息不足时,可以使用ServerKeyExchange构建加密通道;
ServerKeyExchange包含两种形式:
- RSA形式加密:传递的就是RSA构建公钥密码的参数E、N;
- Diff-Hellman密钥交互协议加密:传递的就是密钥交换的参数;
注意,注意,注意:若服务器发送Hello时携带了done的消息,则告诉客户端自己所发的消息结束了,并不会存在ServerKeyExchange报文(包27最底下字段内容)。
4.4. ClientKeyExchange 客户端公钥交换
ClientKeyExchange仍包含两种方式:
- 公钥或者RSA模式(包28):Client根据ClientHello的随机数和ServerHello的随机数生成预备主密码,通过该公钥进行加密,返回到服务侧;
- Diff-Hellman:Client会发送自己这一方要生成Diff-Hellman密钥而需要公开的值。
4.5. *CertificateVerify 证书验证报文
Client向Server证明自己是Client证书的持有者。
4.6. ChangeCipherSpec 更改密钥规格
服务器告知客户端切换密码规格(包29),表示后面的消息将会以前面协商通过的密钥进行加密传输。
4.7. Application Data 应用数据报文
数据传输报文(包30)。
4.8. fnished 传输结束报文
传输结束标识,代表握手协议结束。