技术支持

SSL/TLS握手过程分为两部分,TCP通信和SSL通信部分,SSL部分握手主要是为了身份的验证,确保客户端和服务端通过证书相连接时是安全可信的,而不是第三方冒充的,本文通过Chorme的抓包工具对这个过程进行简单的了解。

SSL/TLS握手过程分为两部分,TCP通信和SSL通信部分,SSL部分握手主要是为了身份的验证,确保客户端和服务端通过证书相连接时是安全可信的,而不是第三方冒充的,本文通过Chorme的抓包工具对这个过程进行简单的了解。

ssl tls tcp banner

如上图,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自带的抓包工具,如下图

ssl tls tcp 01

以访问https://www.baidu.com.com以测试,在上图中输入 ssl/www.baidu.com 来监听百度的SSL通信,并且勾选其三个阶段,分别是:

  • SSL_CONNECT_JOB
  • TRANSPORT_CONNECT_JOB
  • SOCKET

 此时我们可以看到右侧依次将三个阶段通信详情展示如下图:

ssl tls tcp 02

第二部分:SSL通信

下面开始分析,只勾选SOCKET,我们看到下图中

ssl tls tcp 03

注意,上图中 --> 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进行交换

ssl tls tcp 04

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