一.SSL协议概述
SSL是一种在客户端和服务器端之间建立安全通道的协议。
SSL是Secure socket Layer英文缩写,它的中文意思是安全套接层协议,指使用公钥和私钥技术组合的安全网络通讯协议。SSL协议是网景公司(Netscape)推出的基于WEB应用的安全协议,指定了一种在应用程序协议(如Http、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即确保数据的完整性。
SSL以对称密码技术和公开密码技术相结合,可以实现如下三个通信目标:
(1)秘密性:SSL客户机和服务器之间传送的数据都经过了加密处理,网络中的非法窃听者所获取的信息都将是无意义的密文信息。
(2)完整性:SSL利用密码算法和散列(HASH)函数,通过对传输信息特征值的提取来保证信息的完整性,确保要传输的信息全部到达目的地,可以避免服务器和客户机之间的信息受到破坏。
(3)认证性:利用证书技术和可信的第三方认证,可以让客户机和服务器相互识别对方的身份。为了验证证书持有者是其合法用户(而不是冒名用户),SSL要求证书持有者在握手时相互交换数字证书,通过验证来保证对方身份的合法性。
二.SSL协议的体系结构
SSL协议位于TCP/IP协议模型的传输层和应用层之间,使用TCP来提供一种可靠的端到端的安全服务,它使客户端/服务器应用之间的通信不被攻击窃听,并且始终对服务器进行身份认证,还可以对客户端进行身份认证(认证过程需要CA的证书。CA即认证中心,负责确认用户身份,为用户创建数字证书,建立用户身份和一对公私钥的绑定,它自己的证书即为根证书。一方请求得到另一方的证书后,通过公开的CA根证书,完成对其认证,类似于拿到对方的身份证复印件后到警察局核对此人身份)。SSL协议在应用层通信之前就已经完成加密算法、通信密钥的协商以及服务器认证工作,在此之后,应用层协议所传送的数据都被加密。SSL实际上是共同工作的两层协议组成,如下图所示。
从体系结构图可以看出SSL安全协议实际是SSL握手协议、SSL修改密文协议、SSL警告协议和SSL记录协议组成的一个协议族。
SSL记录协议为SSL连接提供了两种服务:一是机密性,二是消息完整性。为了实现这两种服务,SSL记录协议接收传输的应用报文,将数据分片成可管理的块,进行数据压缩(可选),应用MAC(校验消息),接着利用IDEA、DES、3DES或其他加密算法进行数据加密,最后增加由内容类型、主要版本、次要版本和压缩长度组成的首部。被接收的数据刚好与接收数据工作过程相反,依次被解密、验证、解压缩和重新装配,然后交给更高级用户。
SSL修改密文协议是使用SSL记录协议服务的SSL高层协议的3个特定协议之一,也是其中最简单的一个。协议由单个消息组成,该消息只包含一个值为1的单个字节。该消息的唯一作用就是使未决状态拷贝为当前状态,更新用于当前连接的密码组。为了保障SSL传输过程的安全性,双方应该每隔一段时间改变加密规范。
SSL报警协议是用来为通信的对方传递SSL的相关警告。如果在通信过程中某一方发现任何异常,就需要给对方发送一条警示消息通告。警示消息有两种:一种是Fatal错误,如传递数据过程中,发现错误的MAC,双方就需要立即中断会话,同时消除自己缓冲区相应的会话记录;第二种是Warning消息,这种情况,通信双方通常都只是记录日志,而对通信过程不造成任何影响。SSL握手协议可以使得服务器和客户能够相互鉴别对方,协商具体的加密算法和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。
SSL握手协议允许通信实体在交换应用数据之前协商密钥的算法、加密密钥和对客户端进行认证的协议,为下一步记录协议要使用的密钥信息进行协商,使客户端和服务器建立并保持安全通信的状态信息。SSL握手协议是在任何应用程序数据传输之前使用的。SSL握手协议包含四个阶段:第一个阶段建立安全能力;第二个阶段服务器鉴别和密钥交换;第三个阶段客户鉴别和密钥交换;第四个阶段完成握手协议。
三.系统身份认证及建立SSL连接的具体步骤
具体步骤如下:
1.客户端发送初始信息 |
客户端通过SSL协议把服务器需要的客户端的SSL版本信息,加密算法设置,与会话有关的数据,发送给服务器。 |
2.服务器发送初始信息及自己证书,请求客户端证书 |
服务器通过SSL协议把自己的SSL的版本信息,加密算法设置,与会话有关的数据和其它通信需要的信息发给客户端。服务器把自己的证书发给客户端(从USBKey中读取)。同时,服务器端请求客户端的证书。 |
3. 客户端验证服务器证书 |
客户端使用这些服务器发来的信息认证服务器。如果服务器不能被认证,那么客户将被提示一个警告,并且通知客户不能建立加密和认证连接。如果服务器被成功认证,客户端将进入第四步。 |
4.客户端生成握手的初始密钥 |
使用到目前为止的所有数据生成握手过程。客户端(和服务器合作之下)为会话创建一个pre-master secret(一个用在对称加密密钥生成中的46字节的随机数字)。使用服务器的公共密钥加密(在第二步的服务器的证书中获得公共密钥),然后把这个加了密的pre-master secret发送给服务器。 |
5.客户端发送自己证书 |
由于系统中服务器请求客户端认证,客户端也需要标记一个特殊的数据包,客户端和服务器都知道的。在这个过程中,客户端发送一个通过pre-master secret加密过的标记的数据包和客户端自己的证书(从USBKey中读取)给服务器。 |
6.服务器验证客户端证书 |
服务器就认证客户端证书。如果客户端认证不通过,会话将被终止。如果客户端被认证通过,服务器将使用私有密钥解密pre-master secret,然后执行一系列步骤生成master secret。 |
7.双方生成会话密钥 |
客户端和服务器端使用master secret去生成会话密钥。会话密码是在ssl 会话的时候对称密钥,被用来加密、解密信息、校验信息完整性(检查会话过程中任何数据改变)。这样做的主要原因是对称加密比非对称加密的运算量低一个数量级以上,能够显著提高双方会话时的运算速度。 |
8.客户端通知服务器SSL准备完成 |
客户端发送一个信息给服务器端,通知服务器端以后的信息将被会话密码加密,然后客户端发送一个单独(加密)信息表示客户端部分的握手会话已经完成。 |
9. 服务器通知客户端SSL准备完成 |
服务器发送一个信息通知客户端未来的会话信息将被会话密码加密,然后服务器发送一个单独(加密)信息表示服务器部分的握手会话部分已经完成。 |
10.握手结束,正式会话 |
SSL握手会话结束,开始正式的会话。客户端和服务器端使用会话密钥加密解密数据并且互相传送校验完整性。 |
11.终止 |
这是一个正常的操作过程和加密隧道。在任何时候,当内部或者外部触发条件(不是自动就是用户手动),任何一端就要重新协商会话,所有的流程将从新开始。 |
这里用个形象的比喻。假设A与B通信,A是系统客户端,B是系统服务器端,加密后的消息放在方括号[]里,以突出明文消息的区别。双方的处理动作的说明用圆括号()括起。
A:我想和你安全的通话,我这里的对称加密算法有DES,RC5,密钥交换算法有RSA和DH,摘要算法有MD5和SHA。
B:我们用DES-RSA-SHA这对组合好了。这是我的证书,里面有我的名字和公钥,你拿去验证一下我的身份(从USBKey里取出证书,发给A)。我也要验证一下你的证书。目前没有别的可说的了。
A:(查看证书上B的名字是否无误,并通过手头早已有的CA的证书验证了B的证书的真实性,如果其中一项有误,发出警告并断开连接,这一步保证了B的公钥的真实性)。(产生一份秘密消息,这份秘密消息处理后将用作加密密钥,加密初始化向量和hmac的密钥。将这份秘密消息——协议中称为per_master_secret——用B的公钥加密,封装成称作ClientKeyExchange的消息。由于用了B的公钥,保证了第三方无法窃听)。
我生成了一份秘密消息,并用你的公钥加密了,给你(把ClientKeyExchange发给B)。还有,这是我的证书,你拿去验证一下我的身份(从USBKey中读取自己的证书,发给B)。注意,下面我就要用加密的办法给你发消息了!(将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥)[我说完了]。
B:(服务器认证客户端证书,通过手头早已有的CA的证书验证A证书的真实性。如果客户端认证不通过,会话将被终止)。(用自己的私钥将ClientKeyExchange中的秘密消息解密出来,然后将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥,这时双方已经安全的协商出一套加密办法了)注意,我也要开始用加密的办法给你发消息了![我说完了]。
A:[我的秘密是...]
B:[其他人不会听到的...]
OpenSSL是一个开放源代码的SSL协议的产品实现,它采用C语言作为开发语言,具备了跨系统的性能。在系统中调用OpenSSL 的函数就可以实现一个SSL加密的安全数据传输通道,配合使用USBKey来储存key等机密信息,从而达到秘密性,完整性,认证性的目的。