SSL协议工作原理
SSL协议处于互联网多层协议集的传输层上,运行在TCP/IP协议之上而在其他高层协议(如HTTP、Telnet、FTP和IMAP等)之下,如图5-1所示。在建立一次SSL连接之前,首先建立TCP/IP连接。SSL协议可以让应用层协议透明地加以应用。运行时,支持SSL协议的服务器可以同一个支持SSL协议的客户机彼此认证自己,还允许这两个机器之间建立安全的加密连接,同时保证信息在传输过程中的完整性。
SSL协议可以分为4个子协议:SSL握手协议、SSL更改密码规程协议、SSL报警协议和SSL记录协议,其中最重要的两个协议是握手协议和记录协议。SSL记录协议定义了数据传送的格式,它位于一些可靠的传输层协议之上(如TCP),用于各种更高层协议的封装。SSL握手协议位于SSL记录协议之上,并被SSL记录协议所封装。它描述建立安全连接的过程,在客户和服务器传送应用层数据之前,该协议允许服务器与客户机之间协商加密算法和会话密钥,完成通信双方的身份验证等功能。
图5-1 SSL协议的分层结构
SSL记录协议
SSL记录协议(Record Protocol)定义了传输的格式,包括记录头和记录数据格式的规定。发送方记录层的工作过程如图5-2所示:
图5-2 记录层的工作过程
1.记录层从上层接收到任意大小的应用层数据块,把数据快分成不超过214字节的分片。
2.记录层用当前的会话状态中给出的压缩算法静分片压缩成一个压缩快,压缩操作是可选的。
3.每个会话都有相应“加密规格”指定了对称加密算法和MAC算法。记录层用指定的MAC算法对压缩块计算MAC,用指定的对称加密算法加密压缩块和MAC,形成密文块。
4.对密文块添加SSL记录头,然后送到传输层,传输层受到这个SSL记录层数据单元后,记上TCP报头,得到TCP数据包。
图5-3 SSL记录协议中数据项的格式
SSL握手协议
图5-4 SSL建立新会话时的握手过程
1)建立新会话时的握手过程
握手协议用于数据传输之前。它可以进行服务器与客户之间的身份鉴别,同时通过服务器和客户协商,决定采用的协议版本、加密算法,并确定加密数据所需的对称密钥,随后采用公钥加密技术产生共享机密信息(例如对称密钥)。每次连接,握手协议都要建立一个会
话。会话中包含了一套可在多次会话中使用的加密安全参数,从而减轻了每次建立会话的负担。然而,必须指出的是,SSL中的每次连接时,在握手协议中产生的对称密钥都是独特的,这种每次更换密钥的方法显然在更大程度上确保了系统的不易攻破性。
根据是否验证对方的证书,SSL的握手过程可以分为以下三种验证模式:客户和服务器都被验证;只验证客户机,不验证服务器,这是Internet上使用最广泛的形式;客户和服务器都不验证,也称为完全匿名模式。SSL握手协议建立一个新的会话的过程如图5-4所示,具体如下:
阶段1:确定一些相关参数,包括协议版本、会话ID、加密规格、压缩算法和初始随机数
(1)客户端发送client_hello消息给服务器,向服务器传送客户端支持的SSL协议的版本号、加密算法的种类、MAC算法的种类、会话标识、密码属性(如hash块的大小),以及其他服务器和客户端之间通信所需要的各种信息。
(2)服务器以server_hello向客户应答,服务器端传选定的SSL 协议的版本号、加密算法的种类、MAC算法的种类、密码属性及其他相关信息。
阶段2:服务器端发送自身证书(或临时公钥)及证书请求,最后发送hello阶段结束信号。
(3)如果需要验证服务器,服务器将发送certificate消息。服务器首先建立一个随机数,然后对这个随机数进行数字签名,将这个含有签名的随机数和服务器的证书,放在certificate消息中发送给客户端。若不需要验证服务器证书,服务器发送包含其临时公钥的server_key_exchange消息。
(4)若服务器需要验证客户,则发送certificate_request消息
(5)服务器发送hello_done消息,表示双方握手过程中的hello 阶段结束。
阶段3:客户端验证服务器端证书、发送自身证书、交换对称密钥。
(6)客户利用服务器传过来的信息验证服务器的合法性,发送certificate_verify消息,确定验证通过。服务器的合法性包括:证书是否过期,发行服务器证书的CA是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通信将断开;如果合法性验证通过,则将继续进行下一步。
(7)客户端先随机产生一个用于后面通信的预主密码(pre-master-key),然后用服务器的公钥(从服务器的证书中获得)对其加密,再将加密后的预主密码通过client_key_exchange消息传给服务器。
(8)如果服务器要求客户的身份认证(在握手过程中为可选),客户端会首先建立一个随机数,然后对这个随机数进行数字签名,将这个含有签名的随机数和客户自己的证书放在certificate消息中,发送给服务器端。如果客户端没有证书,则会回应no_certificate告警。
阶段4:双方确定加密规格,结束握手协议。
(9)客户端向服务器端发出chenge_cipher_spec信息,指明后面的数据通信将“预主密码”为对称密钥,同时向服务器发送finished 消息,表示完成了与服务器的握手。
(10)服务器检验客户证书和签名随机数的合法性,发送certificate_verify消息。具体的合法性验证包括:客户的证书使用日期是否有效,为客户提供证书的CA是否可靠,发行CA的公钥能否正确解开客户证书的发行CA的数字签名,检查客户的证书是否在证书撤销列表(CRL)中。检验如果没有通过,则通信立刻中断;如果验证通过,则服务器将用自己的私钥解开加密的“预主密码”,然后执行一系列步骤来产生通信使用的主密码(master-key)(客户端也将通过同样的方法产生相同的主密码)。
(11)服务器向客户端发出change_cipher_spec信息,指明后面的数据通信将使用预主密码为对称密钥,同时发送finished消息,通知客户端服务器端的握手过程结束。