今天学习了一下SSL协议的握手内容,在此整理一下,做一个总结。
据说SSL应用广泛,但本人孤陋寡闻,只知道在http协议的基础上加上SSL协议即为https协议。众所周知,https协议比http协议更安全,那么究竟安全在何处呢,这就要探究SSL协议的机制。
我们以客户端A和服务器B的通信为例讲解一下SSL协议的握手过程。
在开始通信前,需要进行握手(当然了,最重要的还是先建立TCP连接),SSL协议的握手过程如下:
1.客户端发送随机数s1,SSL版本号以及可选的加密算法给服务器B。
2.服务器B从可选的加密算法中选择其中一种作为服务器支持的加密算法(暂且称其为m),并且产生一个随机数s2。
服务器将m、s2和一份包含服务器B的RSA公钥的数字证书发送给客户端;该证书还包含了用于认证目的的服务器标识。
3.客户端A使用该证书的认证机构CA公开发布的RSA公钥对该证书进行验证(如果认证机构不靠谱,那就很难受了),同时客户端A又产生一个随机数s3(产生这么多随机数我也很绝望),其实s3有一个专门名称,叫做pre_master_secret。客户端将使用服务器B发送过来的服务器RSA密钥匙(就是存放在数字证书中的那个密钥)对s3进行加密后,得到的内容message,将其发送给B。
4.B用自己的私钥将message解密,此时,客户端和服务器都拥有s1,s2,s3的内容,它们将分别利用这三者的内容独立计算出共享的对称会话密钥(至于怎么计算的,可自行搜索DH密钥交换算法了解,当然我自己也准备写一篇文章来介绍)。本来有了对称密钥,就可以进行通信了,但是为了防止握手本身遭受篡改,还需要进行以下两步检验:
5.客户端将所有握手消息的MAC值发送给服务器;
6.服务器将所有握手消息的MAC值发送给客户端;
图解过程如下:
有了对称密钥后,A和B就能更为安全地进行通信啦!