二、SSL握手过程:1. 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器;
2. 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;3. 客户端对服务器的证书进行验证(有关验证证书,可以参考),并抽取服务器的公用密钥;然后,再产生一个称作pre_master_secret的随机密码串,并使用服务器的公用密钥对其进行加密(参考),并将加密后的信息发送给服务器;4. 客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数值独立计算出加密和MAC密钥(参考)。5. 客户端将所有握手消息的MAC值发送给服务器;6. 服务器将所有握手消息的MAC值发送给客户端。![](https://images.cnblogs.com/cnblogs_com/happyhippy/SSLHandShake.png)
刚才所描述的每一步都需要通过一条或多条握手消息来实现。在此先简要地描述哪些消息与哪几步相对应,然后详细描述每条消息的内容。下图描述了各条消息:
![](https://images.cnblogs.com/cnblogs_com/happyhippy/SSLHandShakeMessage.png)
三、SSL记录协议:
在SSL中,实际的数据传输是使用SSL记录协议来实现的。SSL记录协议是通过将数据流分割成一系列的片段并加以传输来工作的,其中对每个片段单独进行保护和传输。在接收方,对每条记录单独进行解密和验证。这种方案使得数据一经准备好就可以从连接的一端传送到另一端,并在接收到的即刻加以处理。 在传输片段之前,必须防止其遭到攻击。可以通过计算数据的MAC来提供完整性保护。MAC与片段一起进行传输,并由接收实现加以验证。将MAC附加到片段的尾部,并对数据与MAC整合在一起的内容进行加密,以形成经过加密的负载(Payload)。最后给负载装上头信息。头信息与经过加密的负载的连结称作记录(record),记录就是实际传输的内容。下图描述了传输过程:![](https://images.cnblogs.com/cnblogs_com/happyhippy/SSLProtacalStruct.png)
3.1 记录头消息:
记录头信息的工作就是为接收实现(receiving implementation)提供对记录进行解释所必需的信息。在实际应用中,它是指三种信息:内容类型、长度和SSL版本。长度字段可以让接收方知道他要从线路上这取多少字节才能对消息进行处理,版本号只是一项确保每一方使用所磋商的版本的冗余性检查。内容类型字段表示消息类型。3.2 SSL记录类型:
SSL支持四种内容类型:application_data、alert、handshake和change_cipher_spec。使用SSL的软件发送和接收的所有数据都是以application_data类型来发送的,其他三种内容类型用于对通信进行管理,如完成握手和报告错误等。 内容类型alert主要用于报告各种类型的错误。大多数alert(警示)用于报告握手中出现的问题,但也有一些指示在对记录试图进行解密或认证时发生的错误,alert消息的其他用途是指示连接将要关闭。 内容类型handshake用于承载握手消息。即便是最初形成连接的握手消息也是通过记录层以handshake类型的记录来承载的。由于加密密钥还未确立,这些初始的消息并未经过加密或认证,但是其他处理过程是一样的。有可能在现有的连接上初始化一次新的握手,在这种情况下,新的握手记录就像其他的数据一样,要经过加密和认证。 change_cipher_spec消息表示记录加密及认证的改变。一旦握手商定了一组新的密钥,就发送change_cipher_spec来指示此刻将启用新的密钥。四、各种消息协同工作:
正如我们所看到的,SSL是一种分层协议,它以一个记录层以及记录层上承裁的个同消息类型组成。而该记录层又会由某种可靠的传输协议如TCP来承载。下图描述了该协以的结构:![](https://images.cnblogs.com/cnblogs_com/happyhippy/SSLLayer.png)
五、一次SSL连接的完整过程: