SSL 协议详解
安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。
SSL是Netscape于1994年开发的,后来成为了世界上最著名的web安全机制,所有主要的浏览器都支持SSL协议。
目前有三个版本:2、3、3.1,最常用的是第3版,是1995年发布的。
SSL协议的三个特性
握手协议是客户机和服务器用SSL连接通信时使用的第一个子协议,握手协议包括客户机与服务器之间的一系列消息。SSL中最复杂的协议就是握手协议。该协议允许服务器和客户机相互验证,协商加密和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。握手协议是在应用程序的数据传输之前使用的。
每个握手协议包含以下3个字段
比如我们在发送已加密的 HTTP 报文之前,客户端和服务器要进行一次 SSL 握手,在这个握手过程中,它们要完成以下工作:
我这里引述阮一峰在博客中举得alice and Bob 的例子。
下面再进一步详解每一部分:
第一和第二步,建立安全能力
SSL握手的第一阶段启动逻辑连接,建立这个连接的安全能力。首先客户机向服务器发出client hello消息并等待服务器响应,随后服务器向客户机返回server hello消息,对client hello消息中的信息进行确认。
Client hello消息包括Version,Random,Session id,Cipher suite,Compression method等信息。
ClientHello 客户发送CilentHello信息,包含如下内容:
密码套件格式:每个套件都以“SSL”开头,紧跟着的是密钥交换算法。用“With”这个词把密钥交换算法、加密算法、散列算法分开,例如:SSL_DHE_RSA_WITH_DES_CBC_SHA, 表示把DHE_RSA(带有RSA数字签名的暂时Diffie-HellMan)定义为密钥交换算法;把DES_CBC定义为加密算法;把SHA定义为散列算法。
而ServerHello服务器用ServerHello信息应答客户,包括下列内容
这个阶段之后,客户端服务端知道了下列内容:
第二阶段,服务器鉴别与密钥的交换
服务器启动SSL握手第2阶段,是本阶段所有消息的唯一发送方,客户机是所有消息的唯一接收方。该阶段分为4步:
这一步在刚才的例子中被合并在第二步里。其重点在于服务端的验证和密钥的交换。在SSL 中密钥交换算法有6种:无效(没有密钥交换)、RSA、匿名Diffie-Hellman、暂时Diffie-Hellman、固定Diffie-Hellman、Fortezza。
在阶段一那里,双方已经协商确定使用哪种算法。而且CA 证书里包含了公钥。
比如我们协商使用了RSA 交换密钥,那么过程是这样的:
这个方法中,服务器在它的第一个信息中,发送了RSA加密/解密公钥证书。不过,因为预备主秘密是由客户端在下一个阶段生成并发送的,所以第二个信息是空的。注意,公钥证书会进行从服务器到客户端的验证。当服务器收到预备主秘密时,它使用私钥进行解密。服务端拥有私钥是一个证据,可以证明服务器是一个它在第一个信息发送的公钥证书中要求的实体。
第三阶段,客户机鉴别与密钥交换
在这一阶段,主要是我们的客户机启动,发送消息,服务器是唯一的接收方。分为三个阶段:
这里的重点就是,我们的客户端把自己的公钥发给服务端,方便服务端用公钥加密,然后通过服务端之间发过来的证书里的公钥,加密自己的随机数和预备秘密,又保证了秘密的私密性,又证明了它拥有证书的公钥。
第四阶段
刚才服务端收到了用公钥加密的第三个随机数,这时服务端和客户端就可以使用三个随机数生成本次的会话密钥,双方通过计算得到本次使用的会话密钥。然后互相发送:
而这三个随机数要获得总共六个加密秘密:四个密钥(客户公钥私钥 和服务器公钥私钥),两个IV(initialization vector 初始向量,与区块加密模式有关)。加密过程如下图:
首先利用之前发送的预备主秘密,双方发送的随机数等组合散列并获得MD5值,得到一个主秘密。再对主秘密进行处理,得到一串散列值,这个散列值可以拆分成四个密钥和两个IV。
刚才讲的只是在完成了握手协议,下面在握手成功后,双方如何互传信息呢。就需要使用记录协议。记录协议提供了两个服务:
整个记录协议的过程如下:
当客户和服务器发现出现错误的时候,就需要处理这个错误。于是,就向对方发送一个警报信息。如果是致命错误,那么就会立即关闭SSL 连接,而且双方还会删除相关的会话号,秘密和密钥。这就是警报协议,每个警报的信息共有两个字节,第一个字节表示错误类型,如果是警报,置1,如果是致命错误,置2.第二个字节指定实际的错误类型。
相关扩展: