工作过程
SSL的工作过程分为两个阶段:握手过程和数据传输过程。
- 握手过程:实现对服务器和客户端的身份认证、协商密钥和加密套件(密钥交换算法、数据加密算法和MAC算法等)。握手必须在应用数据传输之前完成。
- 数据传输过程:利用握手协商出的密钥和加密套件,将数据分成一系列经过保护的记录进行传输。
握手过程
SSL通过握手在客户端和服务器之间建立会话,完成双方身份的验证、密钥和加密套件的协商。 握手过程如图16-2所示。除Change Cipher Spec消息属于SSL密码变化协议外,其他握手过程交互的消息均属于SSL握手协议,统称为SSL握手消息。
- SSL客户端发送消息给SSL服务器启动握手,携带它支持的SSL版本和加密套件等信息。
- SSL服务器响应SSL客户端,携带选定的版本、加密套件。如果SSL服务器允许SSL客户端在以后的通信中重用本次会话,SSL服务器还会为本次会话分配会话ID。
- SSL服务器将携带自己公钥信息的数字证书发送给SSL客户端,以便客户端对服务器进行身份认证。
- (可选)SSL服务器要求SSL客户端提供证书,以便服务器对客户端进行身份认证。
- SSL服务器通知SSL客户端版本和加密套件协商结束,开始进行密钥交换。
- (可选)SSL客户端发送自己的证书给SSL服务器。
SSL客户端验证SSL服务器的证书合法后,利用证书中的公钥加密SSL客户端随机生成的密钥发给SSL服务器。
实际上,这个随机生成的密钥不能直接用来加密数据或计算MAC值,该密钥是用来计算对称密钥和MAC密钥的信息,称为premaster secret。SSL客户端和SSL服务器利用premaster secret计算出相同的主密钥(master secret),再利用master secret生成用于对称密钥算法、MAC算法的密钥。premaster secret是计算对称密钥、MAC算法密钥的关键。
(可选)SSL客户端发送验证消息给服务器,以便服务器对客户端进行身份认证。
客户端通过计算已交互的握手消息、主密钥的Hash值,利用自己的私钥对其进行加密,通过Certificate Verify消息发给服务器。服务器同样计算已交互的握手消息、主密钥的Hash值,利用客户端证书中的公钥解密Certificate Verify消息,并将解密结果与计算出的Hash值比较。如果二者相同,则客户端身份验证成功。
- SSL客户端通知SSL服务器后续报文将采用协商好的密钥(利用master secret生成的密钥)和加密套件进行加密和MAC计算。
SSL客户端通知SSL服务器,让服务器验证握手过程的安全。
SSL客户端计算已交互的握手消息的Hash值,利用协商好的密钥和加密套件处理Hash值(计算并添加MAC值、加密等),并通过Finished消息发送给SSL服务器。SSL服务器利用同样的方法计算已交互的握手消息的Hash值,并与Finished消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明密钥和加密套件协商成功。
Hash值指的是利用Hash算法(MD5或SHA)将任意长度的数据转换为固定长度的数据。
- SSL服务器通知SSL客户端后续报文将采用协商好的密钥(利用master secret生成的密钥)和加密套件进行加密和MAC计算。
SSL服务器通知SSL客户端,让客户端验证握手过程的安全。
SSL服务器计算已交互的握手消息的Hash值,利用协商好的密钥和加密套件处理Hash值(计算并添加MAC值、加密等),并通过Finished消息发送给SSL客户端。SSL客户端利用同样的方法计算已交互的握手消息的Hash值,并与Finished消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明密钥和加密套件协商成功。
握手成功后,SSL客户端也就完成了对SSL服务器的身份验证。因为只有拥有私钥的SSL服务器才能从Client Key Exchange消息中解密得到premaster secret,才有后续握手的成功。
客户端和服务器握手过程中,需要使用非对称密钥算法来加密密钥、验证通信对端的身份,计算量较大,占用了大量的系统资源。为了简化SSL握手过程,SSL允许重用已经协商过的会话,如图16-3所示,具体过程如下:
- SSL客户端发送Client Hello消息,消息中的会话ID设置为计划重用的会话的ID。
- SSL服务器如果允许重用该会话,则通过在Server Hello消息中设置相同的会话ID来应答。这样,SSL客户端和SSL服务器就可以利用原有会话的密钥和加密套件,不必重新协商。
- SSL客户端发送Change Cipher Spec消息,通知SSL服务器后续报文将采用原有会话的密钥和加密套件进行加密和MAC计算。
- SSL客户端计算已交互的握手消息的Hash值,利用原有会话的密钥和加密套件处理Hash值,并通过Finished消息发送给SSL服务器,以便SSL服务器判断密钥和加密套件是否正确。
- 同样地,SSL服务器发送Change Cipher Spec消息,通知SSL客户端后续报文将采用原有会话的密钥和加密套件进行加密和MAC计算。
- SSL服务器计算已交互的握手消息的Hash值,利用原有会话的密钥和加密套件处理Hash值,并通过Finished消息发送给SSL客户端,以便SSL客户端判断密钥和加密套件是否正确。
数据传输过程
握手完成后,客户端和服务器即可以交换应用层数据。在SSL中,实际的数据传输是使用SSL记录协议来实现的。
图16-4描述了数据传输过程。记录协议接收传输的应用数据,将数据分片成可管理的块,进行数据压缩(可选),添加MAC,接着利用加密算法进行数据加密,最后增加SSL记录报头。被接收的数据刚好与接收数据的工作过程相反,依次被解密、验证、解压缩和重新装配。