SSL/TLS握手过程分为两部分,TCP通信和SSL通信部分,SSL部分握手主要是为了身份的验证,确保客户端和服务端通过证书相连接时是安全可信的,而不是第三方冒充的,本文通过Chorme的抓包工具对这个过程进行简单的了解。
SSL/TLS握手过程分为两部分,TCP通信和SSL通信部分,SSL部分握手主要是为了身份的验证,确保客户端和服务端通过证书相连接时是安全可信的,而不是第三方冒充的,本文通过Chorme的抓包工具对这个过程进行简单的了解。
如上图,SSL握手连接过程下面几个阶段
- 1.client发送ClientHello,指定版本,随机数(RN),所有支持的密码套件(CipherSuites)
- 2.server回应ServerHello,指定版本,RN,选择CipherSuites,会话ID(Session ID)
- 3.server发送Certificate
- 4.Server发送ServerHelloDone
- 5.Client发送ClientKeyExchange,用于与server交换session key
- 6.Client发送ChangeCipherSpec,指示Server从现在开始发送的消息都是加密过的
- 7.Client发送Finishd,包含了前面所有握手消息的hash,可以让server验证握手过程是否被第三方篡改
- 8.Server发送ChangeCipherSpec,指示Client从现在开始发送的消息都是加密过的
- 9.Server发送Finishd,包含了前面所有握手消息的hash,可以让client验证握手过程是否被第三方篡改,并且证明自己是Certificate密钥的拥有者,即证明自己的身份
下面我们使用Chrome的Events工具来分析SSL/TLS从握手到建立通信的全过程。
第一部分:使用工具
在Chrome地址栏中输入:chrome://net-internals/#events
可打开Chrome自带的抓包工具,如下图
以访问https://www.baidu.com.com以测试,在上图中输入 ssl/www.baidu.com 来监听百度的SSL通信,并且勾选其三个阶段,分别是:
- SSL_CONNECT_JOB
- TRANSPORT_CONNECT_JOB
- SOCKET
此时我们可以看到右侧依次将三个阶段通信详情展示如下图:
第二部分:SSL通信
下面开始分析,只勾选SOCKET,我们看到下图中
注意,上图中 --> type = 1 表示当前握手通信(Handshake Type)进行到哪一步,例如A表示ClientHello阶段,详情见下表:
代码(type) |
释义 |
0 | HelloRequest |
1 | ClientHello |
2 | ServerHello |
11 | Certificate |
12 | ServerKeyExchange |
13 | CertificateRequest |
14 | ServerHelloDone |
15 | CertificateVerify |
16 | ClientKeyExchange |
20 | Finished |
1、A部分进行了SSL/TLS建立之前的第一次TCP协商通信
2、B部分在22ms时客户端发送了ClientHello
3、B部分在46ms时服务端回应了SeverHello
到此时,客户端与服务端进行了三次往返的通信,
4、服务端在46ms内又送送了三个handshake,主要是Certificate、ServerKeyExchange、ServerHelloDone共用了一个handshake。
5、客户端在47ms处发送了ClientKeyExchange
客户端拿到服务端的Certificate,使用公钥和session key进行交换
6、客户端发送ChangeCipherSpec
客户端此时告诉服务端,从现在开始发送的消息都是加密过的
7、客户端发送Finished
8、服务端发送ChangeCipherSpec
9、服务端发送Finishd
参考文献:
http://www.cnblogs.com/piyeyong/archive/2010/07/02/1770208.html
http://colin-dumitru.github.io/network/latency/web-performance/2015/02/04/understanding-network-overhead.html