1.简介
安全套接层(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全交换信息的Internet协议,提供了两个基本安全服务:认证和保密。逻辑上,它提供了Web浏览器和Web服务器之间的安全管道。所有主要的Web浏览器都支持SSL协议。
2.SSL在TCP/IP协议中的位置
SSL可以看成TCP/IP协议组中的另一层,介于应用层和传输层之间,这是,不同的TCP/IP协议层之间的通信如下图所示:
可以看出,发送方X的应用层和平常一样准备要发给接收方Y的数据,但与平常不同的是,应用层数据不是直接传给传输层,而是传递给SSL层。这个SSL层对从应用层收到的数据进行加密,并增加自己的加密信息头,称为SSL头。然后,SSL层数据(L5)称为传输层的输入,传输层增加自己的头H4,并将其传递给网际层,等等。这个过程与正常的TCP/IP数据传输一样。最后到达物理层时,以电压脉冲形式在传输媒介上传递。接收方的处理和正常的TCP/IP连接差不多,但到达新SSL层后,SSL层删除SSL头,解密加密的数据,并将明文数据返回接收方的应用层。
这样,SSL只加密应用层数据,而底层的头没有加密,如果SSL加密所有头信息,则要放在数据链路层下面,这样根本不起作用。事实上,这样会造成问题,如果SSL加密所有的低层头,则计算机(发送方,接收方,中间节点)的IP和物理地址也会加密,无法读取。
3.SSL工作原理
SSL有三个子协议:握手协议(Handshake Protocol)、记录协议(Record Protocol)和警报协议(Alert Protocol),这三个协议构成SSL的总体工作。
3.1 握手协议
SSL握手协议是客户机与服务器用SSL连接通信时使用的第一个子协议,类似于Alice和Bob要先握手,然后开始对话。握手协议包括客户机与服务器之间的一系列消息,每个消息的格式如下图所示:
每个握手消息有3个字段如下:
1.Type(类型,1字节):表示10中消息类型之一。
2.Length(长度,3字节):表示消息长度(字节数)。
3.Content(内容,1或多个字节):与消息相关的参数。
下面看看握手协议中客户机与服务器交换的消息类型及其参数。如下表所示:
消息类型 | 参数 |
---|---|
Hello request(握手请求) | 无 |
Client hello(客户机握手) | Version,Random number,Session id,Cipher suite,Compression method |
Server hello(服务器握手) | Version,Random number,Session id,Cipher suite,Compression method |
Certificate(证书) | Chain of X.509V3 certificates |
Server key exchange(服务器密钥交换) | Parameters,signature |
Certificate request(证书请求) | Type,authorities |
Server hello done(服务器握手完成) | 无 |
Certificate verify(证书验证) | Signature |
Client key exchange(客户机密钥交换) | Parameters,signature |
Finished(完成) | Hash value |
握手协议,实际上分为4个阶段,分别是:
1.建立安全能力。
2.服务器认证与密钥交换。
3.客户机认证与密钥交换。
4.完成。
下面分别介绍这四个阶段:
第一阶段:建立安全能力
SSL握手的第一阶段启动逻辑连接,建立这个连接的安全能力,包括消息“Client hello”与“Server hello”。首先是客户机发给服务器的“Client hello”消息,包括以下参数:
1.Version(版本):表示客户机支持的最高SSL版本。
2.Random number(随机数):用户客户机与服务器实际通信,包括两个字段:32位日期时间字段,表示客户计算机的当前系统日期时间;28位随机数,是由客户计算机上的随机数产生器产生的。
3.Session id(会话号):变长会话标识符,如果包含非0值,则表示客户机与服务器已经连接,库户籍要更新参数,而0表示客户机要建立与服务器的新连接。
4.Cipher suite(加密套):客户机支持的加密算法清单。
5.Compression method(压缩方法):列出客户机支持的压缩算法。
客户机向服务器发出“Client hello”消息并等待服务器响应。服务器相应向客户机返回“Server hello”消息,这个消息与“Client hello”消息包含相同字段,但作用不同。“Server hello”消息字段如下:
1.Version(版本):表示客户机和服务器支持的最高SSL版本中较低的版本。如客户机支持了3.1,则服务器选择3。
2.Random number(随机数):这个字段与客户机的Random字段结构相同,但是服务器产生的Random值,独立于客户机的Random值。
3.Session id(会话号):如果客户机发送的会话号是非0值,则服务器使用同一值,否则服务器生成新的会话号,放进这个字段。
4.Cipher suite(加密套):服务器从客客户机发来的 加密套中选择一个加密套。
5.Compression method(压缩方法):服务器从客户机发来的压缩算法中选择一个压缩算法。
第二阶段:服务器认证与密钥交换
服务器启动SSL握手的第二阶段,是本阶段所有消息的唯一发送方。客户机是本阶段所有消息的唯一接收方。这个阶段分为四步,分别是证书、服务器密钥交换、证书请求和服务器握手完全。下面介绍SSL握手第二阶段的每一步:在第一步(证书)中,服务器将数字证书和到根CA的整个链发给客户机,使客户机能用服务器证书中的服务器公钥认证服务器;第二步(服务器密钥交换)是可选的,只在第一步中服务器没有向客户机发送数字证书时使用,向客户机发送公钥;第三步(证书请求),服务器请求客户机的数字证书,客户机认证在SSL中是可选的,服务器不一定要认证客户机,因此这一步是可选的;最后一步(服务器握手完成)消息表示服务器的“Server hello”消息部分已经完成,表示客户机可以验证服务器发送的证书,保证服务器发送的所有参数可以接受。这个消息没有任何参数,发送这个消息后,服务器等待客户机响应。
第三阶段:客户机认证与密钥交换
客户机启动SSL第三阶段,是本阶段所有消息的唯一发送方。服务器本阶段所有消息的唯一接收方,这个阶段分为三步,分别是证书、客户机密钥交换和证书验证。第一步(证书)是可选的,只在服务器请求客户机数字证书时才进行;第二步(客户机密钥交换)使客户机可以从相反方向把信息发给服务器。这个信息与双方在会话中使用的对称密钥相关。这里,客户机生成48字节的预备秘密,用服务器的公钥加密,然后发给服务器;第三步(证书验证)只在服务器要求客户机认证时才需要,这时客户机已经把证书发给服务器,但客户机还要向服务器证明证书中对应的私钥和自己是会话的持有者。为此,在这个可选步中,客户机把预备秘密与客户机和服务器前面交换的随机数组合起来,用MD5与SHA-1算法散列,并用私钥对结果签名。
第四阶段:完成
客户机启动SSL握手第四阶段,使服务器结束,这个阶段共四步,前两个消息来自客户机,是改变加密规范(Change cipher specs)、完成(Finished),后两个消息来自服务器,也是改变加密规范、完成。
根据客户机在客户机密钥交换消息中生成和发送预备秘密,客户机和服务器生成一个主密钥。在记录进行安全加密或完整性检查之前,客户机和服务器需要生成只有他们自己知道的共享密钥,这个值是个48字节值,称为主秘密,主秘密用于生成密钥和秘密,用于加密和MAC计算。主秘密在计算预备秘密、客户机随机数与服务器随机数的消息摘要之后计算,如下图所示:
最后,生成客户机和服务器使用的对称密钥,对称密钥生成的方法如下图所示:
然后,第一步(改变加密规范)从客户端确认一切顺利,并加上Finished消息。服务器也向客户机发送相同的消息。
3.2记录协议
记录协议在客户机与服务器握手成功后起作用,即客户机与服务器可选认证对方和确认安全信息交换使用的算法后,进入SSL记录协议。记录协议向SSL连接提供两个服务如下:
1.保密性:使用握手协议定义的秘密密钥实现。
2.完整性:握手协议还定义了共享秘密密钥(MAC),用于保证消息完整性。
下图显示了记录协议的操作:
如图所示,SSL记录协议以应用消息作为输入,首先将其分成小块,可选压缩每个块,增加MAC,加密,然后加头和传递给传输层,像任何其他TCP块一样经过TCP协议处理。作为接收方则删除每个块的头,解密,验证,解压缩,然后汇编成应用消息,下面详细介绍这些步骤:
1.分块:将应用消息分成块,使每块长度小于或等于16KB。
2.压缩:小块还可以压缩,压缩过程不能造成数据损失,因此要采用无损压缩机制。
3.增加MAC:用握手协议中建立共享秘密密钥求出每个块的MAC(消息认证码),这个操作与HMAC算法相似。
4.加密:用握手协议中建立的秘密密钥将上一步的输出加密,这个加密可能增加块的总长,但增量不超过1024字节。
5.附加头:在加密块中加上附加头,其中包含的字段如下:内容类型(8位),指定上一层处理记录所用的协议;主版本(8位),指定所用SSL协议的主版本;次版本(8位),指定所用SSL协议的次版本;压缩长度(16位),指定原明文块的字节长度。
最终的SSL消息如下图所示:
3.3警报协议
客户机和服务器发现错误时,向对方发一个警报消息。如果是致命错误,则双方立即关闭SSL链接,即双方的传输立即终止。双方还会先删除相关的会话号、秘密和密钥。如果错误不那么严重,则不会终止连接,而是由双方处理错误和继续。每个警报消息共两个字节,第一个字节表示错误类型,如果是警报,则值为1,如果是致命错误,则值为2。第二个字节指定实际错误。
下表列出了致命错误警报:
警报 | 描述 |
---|---|
无关消息(Unexpected message) | 收到不适当的消息 |
坏记录MAC(Bad record MAC) | 收到的消息没有正确MAC |
解压失败(Decompression failure) | 解压缩功能收到错误输入 |
握手失败(Handshake failure) | 发送方无法从选项中得到可接受的安全参数集 |
非法参数(Illegal parameters) | 握手消息中的字段超界或与其他字段不一样 |
下表列出了其余非致命警报
警报 | 描述 |
---|---|
无证书(No certificate) | 在没有适当证书对证书请求响应 |
坏证书(Bad certificate) | 证书有问题,数字签名验证失败 |
不支持的证书(Unsupported certificate) | 不支持收到的证书类型 |
证书吊销(Certificate revoked) | 证书签名者已将证书吊销 |
证书过期(Certificate expired) | 收到的证书已经过期 |
证书未知(Certificate unknown) | 处理证书时发生未指定的错误 |
关闭通知(Close notify) | 表示发送在这个连接中不再发送任何消息,双方都要先发这个消息再关闭连接 |
4.关闭与恢复SSL连接
结束通信之前,客户机与服务器要告诉对方,准备结束连接。双方都要向对方发一个“关闭通知”警报,结束连接。收到这个警报时,立即停止手头工作,并返回一个“关闭通知”警报和结束自己一方的连接。如果SSL连接结束时没有某一方的关闭通知,则这个连接无法恢复。
SSL连接中的握手协议相当复杂和费时,使用非对称密钥加密。因此,如果可能,客户机与服务器最好复用或恢复前面的SSL连接,而不是用新的握手建立新连接。但是,要达到这个结果,双方要协定复用,如果一方认为复用前面的连接有危险或者上次连接之后对方的证书已经到期,则可以强制对方用新握手建立新连接。根据SSL规范,无论什么情况,任何SSL连接均不得在24小时之后复用。
5.SSL的缓冲区溢出攻击
当程序或进程试图把往缓冲区(一种临时数据存储区域)中存储的数据比预先设计的要多时,就会发生缓冲区溢出(buffer overflow)。因为缓冲区是创建为可存储固定大小的数据的,多余的信息(必须要存储到其他地方的信息)可能溢出到相邻的缓冲区,从而导致这些缓冲区原先存储的合法数据的破坏或重写。缓冲区溢出偶尔会因为编程错误而发生,但现在已经成为对数据完整性进行安全攻击的一种常见的类型。在缓冲区溢出攻击中,多余的数据可能含有设计行为导致特定动作的代码,从而往被攻击计算机发送新的指令,这可能会破坏用户的文件、修改数据或危及保密信息。
OpenSSL是SSL协议的一种开源实现。OpenSSL易遭受4种远程可利用的缓冲区溢出攻击。缓冲区溢出攻击的脆弱性使得攻击者可以以OpenSSL进程的特权在目标计算机上运行任意代码,并且有可能发起拒绝服务攻击。这些还只是留在理论上,实践中发生很少。缓冲区溢出的4种脆弱性有3中发生在SSL握手过程中,最后一种则涉及64位操作系统。
1.第一种缓冲区溢出发生在SSL版本2实现的密钥交换中,用户可以用来发送一个超大的主密钥给SSL版本2,从而可能使得该服务器发生拒绝服务或其上运行恶意代码。
2.第二种缓冲区溢出包含在SSL版本3的握手过程中,通过握手的第一阶段发送一个畸形会话ID,恶意服务器就可以在OpenSSL客户端运行代码。
3.第三种缓冲区溢出发生在运行SSL版本3的OpenSSL服务器中,恶意客户可能发送在一个超大的主密钥给可进行Kerberos认证的服务器。
4.第四种缓冲区溢出只存在于64位的os中,此时,用于存储整数的ASCII表示的几个缓冲区可能比所要求的更小。