这里只研究连接过程。

整体的流程是这样的

android 双向SSL验证 ssl双向认证过程_https

前三个那个SYN、SYN ACK、ACK是TCP三次握手,就不说了。

1. 握手成功后,客户端发送自己支持的加密套,和随机数给服务端,也就是Client Hello

对应的是这个:

android 双向SSL验证 ssl双向认证过程_ssl_02

 其中内容

android 双向SSL验证 ssl双向认证过程_https_03

2. 服务端收到Client Hello回复Ack

android 双向SSL验证 ssl双向认证过程_ssl_04

 

3. 服务端发送自己的随机数以及选择一个加密套以及服务端证书给客户端也就是Server Hello

对应的包:

android 双向SSL验证 ssl双向认证过程_服务端_05

 具体内容如下:

android 双向SSL验证 ssl双向认证过程_https_06

 

可知Handshake为Server Hello Done。

Random为随机数。Cipher Suite为选择的加密套。

Certificate里面含有证书。

4. 客户端收到Server Hello后,回复Ack

android 双向SSL验证 ssl双向认证过程_ssl_07

 

5. 客户端端发送自己的证书,握手类型为Client Key Exchange

对应的包:

android 双向SSL验证 ssl双向认证过程_https_08

 内容如下:

android 双向SSL验证 ssl双向认证过程_wireshark_09

其中Handshake Protocol为Client Key Exchange。

Certificate为证书。

6. 服务端收到后回复ACK对应的包如下:

android 双向SSL验证 ssl双向认证过程_wireshark_10

 

7. 客户端发送Certificate Verify

对应的包如下;

android 双向SSL验证 ssl双向认证过程_android 双向SSL验证_11

 内容如下:

android 双向SSL验证 ssl双向认证过程_https_12

发送Certificate Verify类型的握手需要2个前提条件:

①服务端获取了客户端证书;

②客服端发送了非0长度的证书。

客户端想要证明自己拥有该证书,需要用私钥签名一段数据给服务端验证,看服务端能不能用客户端公钥进行验签。

8. 服务端收到后,回复ACK,对应的包如下:

android 双向SSL验证 ssl双向认证过程_wireshark_13

9.客户端发送Change Cipher Spec对应的包如下:

android 双向SSL验证 ssl双向认证过程_ssl_14

 内容如下:

android 双向SSL验证 ssl双向认证过程_服务端_15

步骤1和3,客户端服务端都交换了随机数,通过这个随机数,客户端和服务端会生成预主密钥,这个包的意思就是告诉服务端,我现在开始用主密钥进行加密了(客户端随机数 + 服务端随机数 + 预主密钥 = 主密钥)。

10. 服务端收到后回复ACK对应的包如下:

android 双向SSL验证 ssl双向认证过程_android 双向SSL验证_16

11. 客户端发送Encrypted Handshake Message对应的包如下: 

android 双向SSL验证 ssl双向认证过程_wireshark_17

内容如下:

android 双向SSL验证 ssl双向认证过程_android 双向SSL验证_18

 

这个包的目的就是告诉对端自己再整个握手过程中收到了什么数据,发送了什么数据,来保证中间没人篡改报文。

12. 服务端回复ACK,对应此包:

android 双向SSL验证 ssl双向认证过程_服务端_19

13. 服务端发送Change Cipher Spec对应的包如下:

android 双向SSL验证 ssl双向认证过程_android 双向SSL验证_20

 内容如下:

android 双向SSL验证 ssl双向认证过程_服务端_21

步骤1和3,客户端服务端都交换了随机数,通过这个随机数,客户端和服务端会生成预主密钥,这个包的意思就是告诉客户端,我现在开始用主密钥进行加密了(客户端随机数 + 服务端随机数 + 预主密钥 = 主密钥)。

14. 客户端回复ACK,对应的包如下:

android 双向SSL验证 ssl双向认证过程_wireshark_22

 内容如下:

android 双向SSL验证 ssl双向认证过程_服务端_23

 

15. 服务端发送Encrypted Handshake Message,对应包如下:

android 双向SSL验证 ssl双向认证过程_android 双向SSL验证_24

 内容如下:

android 双向SSL验证 ssl双向认证过程_ssl_25

 

这个包的目的就是告诉对端自己再整个握手过程中收到了什么数据,发送了什么数据,来保证中间没人篡改报文。

16. 客户端回复ACK,这样SSL双向认证就完成了,对应的包如下:

android 双向SSL验证 ssl双向认证过程_服务端_26

 内如下:

android 双向SSL验证 ssl双向认证过程_android 双向SSL验证_27