SSL(Secure Sockets Layer ,安全套接层),是为网络通信提供安全及数据完整性的一种安全协议。由Netscape研发,用以保障在Internet上数据传输的安全,利用数据加密(Encryption)技术,确保数据在网络上的传输过程中不会被截取及窃听。
当前几乎所有浏览器都支持SSL,但是支持的版本有所不同。从图8-1中可以看到,IE同时支持SSL 2.0和SSL 3.0两个版本。
图8-1 IE支持的SSL版本
事实上各位读者已经明白了SSL的工作原理,回顾我前面博客讲到的公钥加密的通信原理,而SSL使用的就是公钥加密系统。现在完全可以构想基于SSL的数据通信流程。前面说过,SSL是一种协议,本节重点在于协议本身和它是如何工作在各种协议之间来提供安全通信的。
SSL协议位于TCP/IP协议模型的网络层和应用层之间,使用TCP来提供一种可靠的端到端的安全服务,它使客户/服务器应用之间的通信不被攻击窃听,并且始终对服务器进行认证,还可以选择对客户进行认证。SSL协议在应用层通信之前就已经完成加密算法、通信密钥的协商,以及服务器认证工作,在此之后,应用层协议所传送的数据都被加密。
SSL协议体系结构如图8-2所示。
图8-2 SSL协议体系结构
从体系结构图可以看出,SSL协议可分为两层:
q SSL记录协议(SSL Record Protocol):建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
q SSL握手协议(SSL Handshake Protocol):建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。SSL协议实际上是SSL握手协议、SSL修改密文协议、SSL警告协议和SSL记录协议组成的一个协议族。下面分别进行介绍。
SSL记录协议
SSL记录协议为SSL连接提供两种服务:机密性和报文完整性。
在SSL协议中,所有的传输数据都被封装在记录中。记录是由记录头和记录数据(长度不为0)组成的。所有的SSL通信都使用SSL记录层,记录协议封装上层的握手协议、报警协议、修改密文协议。SSL记录协议包括记录头和记录数据格式的规定。
SSL记录协议定义了要传输数据的格式,它位于一些可靠的传输协议之上(如TCP),用于各种更高层协议的封装。主要完成分组和组合、压缩和解压缩,以及消息认证和加密等。
SSL记录协议主要操作流程如图8-3所示。
图8-3 SSL记录协议的操作流程
图中的五个操作简单介绍如下:
1)每个上层应用数据被分成214字节或更小的数据块。记录中包含类型、版本号、长度和数据字段。
2)压缩是可选的,并且是无损压缩,压缩后内容长度的增加不能超过1024字节。
3)在压缩数据上计算消息认证MAC。
4)对压缩数据及MAC进行加密。
5)增加SSL记录。
SSL记录协议字段的结构如图8-4所示。
图8-4 SSL记录协议字段的结构
如图8-4 SSL记录协议字段结构主要由内容类型、主要版本、次要版本、压缩长度组成,简介如下:
1) 内容类型(8位):封装的高层协议。
2) 主要版本(8位):使用的SSL主要版本。对于SSL v3已经定义的内容类型是握手协议、警告协议、改变密码格式协议和应用数据协议。
3) 次要版本(8位):使用的SSL次要版本。对于SSL v3.0,值为0。
4) 压缩长度(16位):明文数据(如果选用压缩则是压缩数据)以字节为单位的长度。
说明 已经定义的内容类型是握手协议、警告协议、修改密文协议。
SSL报警协议
SSL报警协议是用来为对等实体传递SSL的相关警告。如果在通信过程中某一方发现任何异常,就需要给对方发送一条警示消息通告。警示消息有两种:
q Fatal错误,如传递数据过程中发现错误的MAC,双方就需要立即中断会话,同时消除自己缓冲区相应的会话记录。
q Warning消息,这种情况,通信双方通常都只是记录日志,而对通信过程不造成任何影响。SSL握手协议可以使得服务器和客户能够相互鉴别对方,协商具体的加密算法和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。
SSL修改密文协议
为了保障SSL传输过程的安全性,客户端和服务器双方应该每隔一段时间改变加密规范。所以有了SSL修改密文协议。SSL修改密文协议是3个高层的特定协议之一,也是其中最简单的一个。在客服端和服务器完成握手协议之后,它需要向对方发送相关消息(该消息只包含一个值为1的单字节),通知对方随后的数据将用刚刚协商的密码规范算法和关联的密钥处理,并负责协调本方模块按照协商的算法和密钥工作。
SSL握手协议
SSL握手协议被封装在记录协议中,该协议允许服务器与客户机在应用程序传输和接收数据之前互相认证、协商加密算法和密钥。在初次建立SSL连接时,服务器与客户机交换一系列消息。
这些消息交换能够实现如下操作:
q 客户机认证服务器
q 允许客户机与服务器选择双方都支持的密码算法
q 可选择的服务器认证客户
q 使用公钥加密技术生成共享密钥
q 建立加密SSL连接
SSL握手协议报文头包括三个字段:
q 类型(1字节):该字段指明使用的SSL握手协议报文类型。
q 长度(3字节):以字节为单位的报文长度。
q 内容(≥1字节):使用的报文的有关参数。
SSL握手协议的报文类型如表8-1所示。
表8-1 SSL握手协议报文类型
报文类型 |
参数 |
hello_request |
空 |
client_hello |
版本、随机数、会话ID、密文族、压缩方法 |
server_hello |
版本、随机数、会话ID、密文族、压缩方法 |
certificate |
x.509V3证书链 |
server_key_exchange |
参数、签名 |
certificate_request |
类型、授权 |
server_done |
空 |
certificate_verify |
签名 |
client_key_exchange |
参数、签名 |
finished |
Hash值 |
SSL握手协议过程如图8-5所示。
图8-5 SSL握手协议的过程(带*的传输是可选的,或者与站点相关的,并不总是发送的报文)
现在看图8-5,分步说明SSL握手协议的全过程:
步骤1 建立安全能力。
客户机向服务器发送client_hello报文,服务器向客户机回应server_hello报文。建立的安全属性包括:协议版本、会话ID、密文族、压缩方法,同时生成并交换用于防止重放攻击的随机数。密文族参数包括密钥交换方法(Deffie-Hellman密钥交换算法、基于RSA的密钥交换和另一种实现在Fortezza chip上的密钥交换)、加密算法(DES、RC4、RC2、3DES等)、MAC算法(MD5或SHA-1)、加密类型(流或分组)等内容。
步骤2 认证服务器和密钥交换。
在hello报文之后,如果服务器需要被认证,服务器将发送其证书。如果需要,服务器还要发送server_key_exchange;然后,服务器可以向客户发送certificate_request请求证书。服务器总是发送server_hello_done报文,指示服务器的hello阶段结束。
步骤3 认证客户和密钥交换。
客户一旦收到服务器的server_hello_done报文,客户将检查服务器证书的合法性(如果服务器要求),如果服务器向客户请求了证书,客户必须发送客户证书,然后发送client_key_exchange报文,报文的内容依赖于client_hello与server_hello定义的密钥交换的类型。最后,客户可能发送client_verify 报文来校验客户发送的证书,这个报文只能在具有签名作用的客户证书之后发送。
步骤4 结束。
客户发送change_cipher_spec报文并将挂起的CipherSpec复制到当前的CipherSpec。这个报文使用的是修改密文协议。然后,客户在新的算法、对称密钥和MAC秘密之下立即发送finished报文。finished报文验证密钥交换和鉴别过程是成功的。服务器对这两个报文响应,发送自己的change_cipher_spec报文、finished报文。握手结束,客户与服务器可以发送应用层数据了。
当客户从服务器端传送的证书中获得相关信息时,需要检查以下内容来完成对服务器的认证:
q 时间是否在证书的合法期限内;
q 签发证书的机关是否客户端信任的;
q 签发证书的公钥是否符合签发者的数字签名;
q 证书中的服务器域名是否符合服务器自己真正的域名。
服务器被验证成功后,客户继续进行握手过程。
同样地,服务器从客户传送的证书中获得相关信息认证客户的身份,需要检查:
q 用户的公钥是否符合用户的数字签名;
q 时间是否在证书的合法期限内;
q 签发证书的机关是否服务器信任的;
q 用户的证书是否被列在服务器的LDAP里用户的信息中;
q 得到验证的用户是否仍然有权限访问请求的服务器资源。
---------------注:本文部分内容改编自《.NET 安全揭秘》