SSL VPN (原理二 握手协议)

来源:互联网 发布:系统架构图软件 编辑:程序博客网 时间:2024/04/29 15:15

      Client                                                Server

      ClientHello                   -------->
                                                       ServerHello
                                                      Certificate*
                                                ServerKeyExchange*
                                               CertificateRequest*
                                    <--------      ServerHelloDone
      Certificate*
      ClientKeyExchange
      CertificateVerify*
      [ChangeCipherSpec]
      Finished                      -------->
                                                [ChangeCipherSpec]
                                    <--------             Finished
      Application Data              <------->     Application Data

如上:其中 带* 号的消息是可选的。

1、客户端主动发起情况下,SSL 握手协议由客户端先主动 client hello消息,在该消息里 客户端向服务端通告自已支持的密码算法列表、压缩算法、随机数、会话ID及ssl版本号。

此消息为客户端的握手交互的第1个消息,但在重协商情况下,此消息是为了应答服务端的request请求消息而被动发出的。

2、服务端收到客户端的client hello消息后,会从客户端支持的协商参数中选择本端支持的参数,带上自已的随机数、会话ID及本端的ssl版本号,然后封装为server hello消息发送给客户端。

3、如果需要认证服务端:通常情况下都需要验证服务端

  1) 立即发送Certificate消息,服务端的证书(内含服务端的公钥)

   2) 如果服务端没有证书或者服务端的证书只能用于签名,则需要发送ServerKeyExchange消息。此消息中含有服务端选择的密钥交换算法等。

4、如果同时认证客户端,则需要发送CertificateRequest消息。

5、ServerHelloDone 消息表示服务端的Server hello消息结束。

6、客户端收到服务端的证书请求消息后,会发送客户端的证书消息(Certificate消息)给服务端,此客户端的证书消息中含有客户端的公钥。

7、客户端发送ClientKeyExchange消息,此消息会将客户端的客户端的预主秘钥采取服务端的公钥进行加密,服务端收到此消息后利用服务端的私钥进行解密,这样服务端就可以知道客户端的预主秘钥,于是客户端和服务端就可以共享了此预主秘钥,从而客户端和服务端各自根据已经协商好的密码算法参数进行运算,最后双方产生一个相同的对称密钥,用于后续应用层数据加密。

8、CertificateVerify消息和证书消息一起发送给服务端,以便于服务端根据客户端的证书来验证客户端的签名的有效性。

9、客户端和服务端分别发送ChangeCipherSpec消息,用于通告对方握手交互已经完成,后续所有数据交互都已经采取协商好的对称密钥加密的了。

至此 SSL 握手已经完成,application data 已经利用双方共享的对称密钥加密,加密后的数据会被 记录层协议封装,然后发送出去并被对方接收。