1.SSL握手协议的功能
(1)协商通讯所使用的SSL协议版本 目前在应用中可能遇到的SSL版本有SSL 2.0,SSL3.0,SSL3.1(TLS1.0)。SSL的客户端与服务器端在正式传输数据前,需要协商出双方都支持的最高协议版本。
(2)协商通讯所使用的加密套件 加密套件是SSL通讯过程中所用到的各种加密算法的一种组合,SSL协议的加密套件包括了密钥交换算法、加密算法、HMAC算法。在RFC2246中,规定了6种必须实现的加密套件:
●TLS_RSA_WITH_RC4_128_MD5
●TLS_RSA_WITH_RC4_128_SHA
●TLS_RSA_WITH_DES_CBC_SHA
●TLS_RSA_WITH_3DES_EDE_CBC_SHA
●TLS_RSA_WITH_AES_128_CBC_SHA
●TLS_RSA_WITH_AES_256_CBC_SHA
(3)协商加密所使用的密钥参数 块加密算法需要的密钥参数有初始化向量(IV)、加密密钥、MAC密钥。
流加密算法需要的密钥参数有流加密的初始状态、MAC密钥。
SSL连接是双向的,每个传输方向上都有一套加密密钥。所以对块加密算法,需要产生6个密钥参数,对流加密需要产生4个密钥参数。
(4)通讯双方彼此验证对方的身份(可选) SSL协议通过个人的公钥证书和私钥的数字签名来验证用户的真实身份。服务器端必须传送自己的证书给客户端;当服务器端需要验证客户端的真实身份时,可以通过CertificateRequest消息向客户端索要证书。
(5)建立SSL连接和维护SSL会话 在完成了上述协商任务,验证了对方的合法身份后,通讯双方就建立起了SSL连接。协商出来的参数,如协议版本、加密套件和密钥参数等,都保存到会话(session)中。当SSL连接断开后,SSL会话并不会立即被清除,还会在SSL服务器端和客户端保留一段时间。如果客户端后续还要与相同的服务器端进行SSL通讯,则可以通过恢复SSL会话快速建立起SSL连接。
2.SSL握手协议的握手过程
SSL握手协议规定了3种握手过程:
(1)无客户端认证的全握手过程 所谓全握手过程是指一个完整的SSL连接建立过程,在其中需要建立新的SSL会话,协商出新的会话参数。无客户端认证是指在该过程中服务器端并不验证客户端的身份。但是,服务器端需要传递证书给客户端,客户端是否对服务器的证书进行验证由客户端的具体实现来决定。
其中的密钥交换过程可以采用DH算法也可以采用RSA算法,一般采用RSA算法。在握手过程中的最后阶段,双方将向对方发送加了密的Finished报文,用来检验整个协商过程是否受到破坏。
(2)有客户端认证的全握手过程 如果服务器端想验证客户端的真实身份,在建立SSL连接的过程中,服务器端可以发送CertificateRequest消息,向客户端索要个人公钥证书和数字签名,以此验证客户端的真实身份。
(3)会话恢复过程 在一般情况下,一次通讯过程结束后,SSL连接就会被关闭。下一次访问相同的SSL服务器时,客户端需要重新建立SSL连接。由于在SSL连接建立的过程中会涉及很多复杂的计算,因而比较耗时。为了提高SSL连接建立的效率,SSL协议提供了会话恢复机制。SSL协议的会话管理包括以下内容:
在一次全握手过程后,SSL协议的通讯双方分别使用会话记录下刚才协商过的会话参数,包括SSL协议的版本、加密套件和各种密钥参数。
在一次通讯过程结束后,SSL协议的服务器端和客户端虽然关闭了SSL连接,但并不立即清除SSL会话,而是将会话参数在各自的缓存中保存一段时间。
在会话记录有效的时间内,客户端后续对同一服务器发起的SSL连接可以使用上一次建立连接时保存在缓存中的SSL会话参数,从而避免了耗时的SSL会话协商过程。
如果缓存中的会话记录长时间没有被使用,在超过一定的时间后,会话将被清除。
3.无客户端认证的全握手过程
通讯过程涉及的报文如下:
(1)ClientHello 客户端首先发出ClientHello报文,向服务器端请求建立SSL连接。报文携带了客户端最高支持的SSL协议版本、可以支持的加密套件列表、用于生成密钥的客户端随机数等信息。如果是新建立的SSL连接,报文中的会话ID字段就为0。
(2)ServerHello 服务端通过此报文向客户端表明自己可以接收的协议版本、加密套件、用于生成密钥的服务器端随机数。服务器端为本次SSL通讯会话分配了一个会话ID,通过此报文返回给客户端。(www.xing528.com)
(3)ServerCertificate 传送服务器端的证书给客户端,客户端可以对此证书进行验证。
(4)ServerKeyExchange 当采用DH密钥交换算法时,ServerCertificate消息不足以携带足够多的信息用于密钥交换,便采用ServerKeyExchange消息携带附加的信息。该消息是可选的。
(5)ClientKeyExchange 用于传送密钥交换报文。如果通讯双方选择了RSA密钥交换算法,则整个密钥交换过程如下:客户端用随机函数生成一个密钥参数PreMasterKey,然后用服务器端证书中的公钥对密钥参数进行加密,通过ClientKeyExchange消息将加了密的密钥参数传给对方。Server端收到ClientKeyExchange消息后,用自己的私钥对报文进行解密,得到PreMasterKey。然后由PreMasterKey派生出记录层加密所需要的多个加密参数。客户端直接ChangeCipherSpec消息。
(6)ChangeCipherSpec 通知对方本端开始启用加密参数,后续发送的数据将是密文。
(7)Finshed 对前面所有的握手消息计算摘要。收发双方都计算Finshed报文,然后比较对方计算的Finshed报文。如果一致,说明握手过程没有被破坏。Finshed报文是双方发送的第一个加密报文。Finshed报文验证完后,通讯双方就建立起了一条SSL连接。其后双方就可以通过该SSL连接传输应用层数据了。
4.有客户端的全握手过程
有客户端认证的全握手过程如图5.76所示。
图5.76 SSL协议简介——有客户端认证的全握手过程
与无验证的全握手过程相比,有验证的过程多了3个消息:
(1)CertificateRequest 服务器端向客户端要证书。
(2)Certicate 客户端将包含自己公钥的证书传送给了服务器端。
(3)CertificateVerify 客户端对在此之前发送和接收的所有握手报文进行计算摘要,并用自己的私钥进行加密。这样就获得了对前面所有握手消息的数字签名。服务器端收到该消息后,用客户端证书中的公钥对数字签名进行解密,并比较该摘要与自己一方计算的摘要是否一致。如果一致就说明:摘要正确,且客户端拥有与客户端证书中的公钥相匹配的私钥,因而证明客户端的身份就是其证书中所声明的。
5.会话恢复过程
会话恢复过程如图5.77所示。
图5.77 会话恢复过程
ClientHello报文中携带了上次会话的ID,服务器端可以根据此ID查找到服务器端缓存中保存的会话参数。
如果服务器端并没有找到保存的会话,就在回应的ServerHello报文中携带一个不同的会话ID;客户端如果发现服务器端返回的会话ID与自己提供的不一致,就知道要开始一个全握手过程了,需要重新协商加密参数。
如果服务器端找到了保存的会话,就根据此会话中的参数回应一个ServerHello报文。接下来,通讯双方跳过密钥参数协商过程,直接发送ChangeCipherSpec启用原来会话中的加密参数,开始加密通讯。
6.关闭SSL连接的过程
关闭SSL连接的操作可以由Client端或Server端任何一方的应用层触发,如图5.78所示。SSL层在执行关闭连接的操作时,可以有两种实现方式:
(1)友好的关闭方式 一方向另一方发送Close_notify消息,通知对方本端不再发送数据。对方收到此消息后将返回一个Close_notify消息作为应答,同时执行关闭连接的操作。先发送Close_notify消息的一方不必等待对方返回的Close_notify消息,就可以在本端执行关闭连接的操作。
图5.78 关闭SSL连接的过程
Close_notify消息是SSL协议中Alert类型的消息。Alert类型消息有两个字节构成:级别(1:warning,2:fatal),内容(0:Close_notify,…)。
(2)不友好的关闭方式 在具体的实现中,SSL协议实体也可以直接关闭TCP连接,以中断SSL通讯。只是这种实现方式不够安全,易受到截断攻击。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。