SSL加密包括两个部分,一个是建立加密隧道,一个是加密数据传输。其中,建立加密隧道使用非对称加密,而数据传输则是使用对称加密方式。
建立加密隧道过程,具体见下图
单向认证:
(1) SSL 客户端通过 Client Hello 消息将它支持的 SSL 版本、加密算法、密钥交换算法、MAC算法等信息发送给 SSL服务器。
(2) SSL 服务器确定本次通信采用的 SSL 版本和加密套件,并通过 Server Hello消息通知给 SSL 客户端。如果 SSL 服务器允许 SSL 客户端在以后的通信中重用本次会话,则 SSL 服务器会为本次会话分配会话 ID,并通过 Server Hello消息发送给 SSL客户端。
(3) SSL 服务器将携带自己公钥信息的数字证书通过Certificate 消息发送给 SSL客户端。
(4) SSL 服务器发送 Server Hello Done 消息,通知 SSL 客户端版本和加密套件协商结束,开始进行密钥交换。
(5) SSL 客户端验证 SSL 服务器的证书合法后,利用证书中的公钥加密 SSL 客户端随机生成的 premaster secret,并通过 Client Key Exchange消息发送给SSL服务器。
(6) SSL客户端发送 Change Cipher Spec消息,通知 SSL服务器后续报文将采用协商好的密钥和加密套件进行加密和 MAC计算。
(7) SSL 客户端计算已交互的握手消息(除 ChangeCipher Spec 消息外所有已交互的消息)的 Hash值,利用协商好的密钥和加密套件处理 Hash值(计算并添加 MAC 值、加密等),并通过 Finished 消息发送给 SSL 服务器。SSL服务器利用同样的方法计算已交互的握手消息的 Hash 值,并与 Finished 消息的解密结果比较,如果二者相同,且 MAC值验证成功,则证明密钥和加密套件协商成功。
(8) 同样地,SSL服务器发送Change Cipher Spec消息,通知 SSL客户端后续报文将采用协商好的密钥和加密套件进行加密和 MAC计算。
(9) SSL 服务器计算已交互的握手消息的 Hash 值,利用协商好的密钥和加密套件处理 Hash 值(计算并添加 MAC 值、加密等),并通过 Finished 消息发送给 SSL 客户端。SSL 客户端利用同样的方法计算已交互的握手消息的Hash 值,并与 Finished 消息的解密结果比较,如果二者相同,且 MAC值验证成功,则证明密钥和加密套件协商成功。 SSL客户端接收到SSL服务器发送的Finished消息后,如果解密成功,则可以判断SSL服务器是数字证书的拥有者,即SSL服务器身份验证成功,因为只有拥有私钥的SSL服务器才能从Client Key Exchange消息中解密得到premaster secret,从而间接地实现了SSL客户端对SSL服务器的身份验证。
双向认证:
SSL客户端的身份验证是可选的,由SSL服务器决定是否验证SSL客户端的身份。如图中蓝色部分标识的内容所示,如果SSL服务器验证SSL客户端身份,则SSL服务器和SSL客户端除了交互“只验证服务器的SSL握手过程”中的消息协商密钥和加密套件外,还需要进行以下操作:
(1) SSL服务器发送 Certificate Request消息,请求 SSL客户端将其证书发送给SSL服务器。
(2) SSL 客户端通过 Certificate 消息将携带自己公钥的证书发送给 SSL 服务器。SSL服务器验证该证书的合法性。
(3) SSL 客户端计算已交互的握手消息、主密钥的 Hash 值,利用自己的私钥对其进行加密,并通过 Certificate Verify消息发送给 SSL服务器。
(4) SSL 服务器计算已交互的握手消息、主密钥的 Hash 值,利用 SSL 客户端证书中的公钥解密 Certificate Verify消息,并将解密结果与计算出的 Hash值比较。如果二者相同,则 SSL客户端身份验证成功。
我们的SSL是双向认证(证书认证),不过我们允许SSL重协商。