2.1 理解SSL和OpenSSL如何工作
2.1.1 SSL功能
SSL(Secure Socket Layer)是Netscape公司提出的主要用于Web的安全通信标准,有2.0版和3.0版。TLS(Transport Layer Security)是IETF的TLS工作组在SSL3.0基础之上提出的安全通信标准,目前版本是1.0,即RFC2246.SSL/TLS,它提供的安全机制可以保证应用层数据在互联网上传输不被监听、伪造和窜改。
一般情况下,在网络协议应用中,数据在机器中经过简单的由上到下的几次包装后进入网络,如果这些包被截获,那么可以很容易地根据网络协议得到里面的数据(由网络监听工具可以很容易地做到这一点)。
SSL就是为了加密这些数据而产生的协议,可以这么理解,它是位于应用层和TCP/IP之间的一层,数据经过它流出的时候被加密,再送往TCP/IP,而数据从TCP/IP流入之后先进入它这层被解密,同时它也能够验证网络连接两端的身份。
它的主要功能就是两个:
① 加密、解密在网络中传输的数据包,同时保护这些数据不被修改和伪造;
② 验证网络对话中双方的身份。
SSL协议包含两个子协议:一个是包协议;一个是握手协议。包协议是说明SSL的数据包应该如何封装。握手协议则是说明通信双方如何共同协商、决定使用什么算法及算法使用的key。包协议位于握手协议下一层。
2.1.2 SSL协议简介
SSL协议工作在Linux TCP/IP协议和HTTP协议之间,SSL是一个介于HTTP协议与TCP协议之间的一个可选层,其关系如图2-1所示。
图2-1 SSL协议,Linux TCP/IP协议与其他协议之间的关系
SSL Handshake Protocol中文名称是SSL握手协议,用来完成客户端和服务器之间对话的建立。SSL握手协议是SSL协议中最复杂的协议。服务器和客户端使用这个协议相互鉴别对方的身份、协商加密算法和MAC算法,以及在SSL记录协议中加密数据的加密密钥和初始向量。握手协议是建立SSL连接首先应该执行的协议,必须在传输任何数据之前完成。
SSL Change Cipher Spec Protocol中文名称是SSL修改密文协议,以实际建立对话使用密码组的约定。SSL Change Cipher Spec Protocol是一个最简单的SSL相关协议,它只有一个报文,报文由值为1的单个字节组成。这个协议的唯一作用就是将挂起状态复制到当前状态,改变连接将要使用的密码族。
SSL Alert Protocol中文名称是SSL告警协议,在客户端和服务器之间传输SSL出错消息。SSL告警协议是将SSL有关的告警信息传送给通信的对方实体。SSL告警协议跟其他使用SSL的应用协议(如HTTP协议)一样,告警报文按照当前状态说明被压缩和加密。
SSL Record Protocol中文名称是SSL记录协议,为不同的高层协议提供安全服务,HTTP、FTP等高层应用协议都可以在SSL协议上运行。顾名思义,记录协议是描述SSL信息交换的过程中的记录格式。SSL协议介于应用层和网络层之间,因此它会接收来自应用层的信息,并加以包装后交由下一层(也就是网络层来传送)。
SSL层:借助下层协议的告警信道安全协商出一份加密密钥,并用此密钥来加密HTTP请求。TCP层:与Web Server的443端口建立连接,传递SSL处理后的数据。接收端与此过程相反。SSL在TCP之上建立了一个加密通道,通过这一层的数据都进行了加密,因此可以达到保密的效果。
2.1.3 SSL工作流程
如图2-2所示是SSL工作流程图。
图2-2 SSL工作流程图
SSL使用公用密钥加密技术,服务器在连接结束时给客户端发送公用密钥用来加密信息,而加密的信息只有服务器用它自己持有的专用密钥才能解开。客户端使用公用密钥加密数据,并且发送给服务器自己的密钥,以唯一确定自己,防止在系统两端之间有人冒充服务器或客户端进行欺骗。加密的HTTP连接用443端口号代替80端口号,以区别于普通的不加密的HTTP。客户端使用加密HTTP连接时会自动使用443端口而不是80端口,这使得服务器更容易做出相应的响应。SSL验证和加密的具体过程如下。
(1)客户端发送“你好”消息(以客户端首选项顺序排序),如SSL的版本、客户端支持的密码对和客户端支持的数据压缩方法。消息也包含28字节的随机数。
(2)服务器以“你好”消息响应,此消息包含密码方法(密码对)和由服务器选择的数据压缩方法,以及会话标志和另一个随机数。
注意 客户端和服务器必须至少支持一个公共密码对,否则握手失败。服务器一般选择最强大的公共密码对。
(3)服务器发送其数字证书(服务器使用带有SSL的X.509 V3数字证书)。如果服务器使用SSL V3,而服务器应用程序(如Web服务器)需要数字证书进行客户端认证,则客户端会发出“数字证书请求”消息。在“数字证书请求”消息中,服务器发出支持的数字证书类型的列表和可接受的认证中心的专有名称。
(4)服务器发出“你好完成”消息并等待客户端响应。
(5)接收到服务器“你好完成”的消息,客户端(Web浏览器)将验证服务器的数字证书的有效性并检查服务器的“你好”消息参数是否可以接受。
如果服务器请求客户端数字证书,客户端将发送数字证书;如果没有可用的合适的数字证书,客户端将发送“没有数字证书”告警。此告警仅仅是告警而已,如果客户端认证是强制性的,服务器应用程序将会使会话失败。
(6)客户端发送“客户端密钥交换”消息。此消息包含pre-master secret(一个用在对称加密密钥生成中的46字节的随机数字)和消息认证代码(MAC)密钥(用服务器的公用密钥加密的)。如果客户端发送数字证书给服务器,客户端将发出签有客户端的专用密钥的“数字证书验证”消息。通过验证此消息的签名,服务器可以显示验证客户端数字证书的所有权。如果服务器没有属于数字证书的专用密钥,它将无法解密pre-master secret,也无法创建对称加密算法的正确密钥,握手将失败。
(7)客户端使用一系列加密运算将pre-master secret转化为master secret,其中将派生出所有用于加密和消息认证的密钥材料。然后,客户端发出“更改密码规范”消息将服务器密码转换为新协商的密码对。客户端发出的下一个消息(“未完成”的消息)为用此密码方法和密钥加密的第一条消息。
(8)服务器以自己的“更改密码规范”和“已完成”消息响应。
(9)SSL握手结束,且可以发送加密的应用程序数据。
SSL协议有多种版本。SSL3.0的一个优点是增加了对加载证书链的支持,以允许服务器在发给浏览器的授予者证书上附加一个服务器证书。链的加载也允许浏览器验证服务器证书,即使对此授予者的证书机构并没有安装,因为它已经包含在这个证书链中了。SSL3.0目前正由Internet Engineering Task Force(IETF)研发,是传输层安全(TLS)协议标准的基础。
2.1.4 OpenSSL简介
上面我们简单介绍了SSL协议,与所有的协议一样,都只是一些规则而已,真正要应用,必须将所有的协议规则转换成代码,对于任何个人和组织来说,这都是一项艰巨的任务,尤其是SSL协议这样一种涉及诸多专业知识的协议。目前,主流的Web服务器和浏览器都支持SSL协议,但由于这些商业产品的源代码不是开放的,使得对这些商业产品的信任和研究大大落后。
OpenSSL是一个开放源代码的SSL协议的产品,它采用C语言作为开发语言。OpenSSL项目最早由加拿大人Eric A. Yang和Tim J. Hudson开发,现在由OpenSSL项目小组负责改进和开发,这个小组由全球的一些技术精湛的志愿人员组成,它们的劳动都是无偿的。OpenSSL最早的版本在1995年发布,1998年以后开始由OpenSSL项目组维护和开发。当前最新的版本是0.9.7b版本,完全实现了对SSLV1、SSLV2、SSLV3、TLS的支持。OpenSSL的源代码库可以从OpenSSL的官方网站www.openssl.org自由下载,并可以免费用于任何商业或非商业的目的。由于采用C语言开发,OpenSSL的源代码库具有良好的跨系统性能,支持Linux、UNIX、Windows、Mac、VMS等多种平台。目前,OpenSSL已经得到了广泛的应用,大型软件中的安全部分都使用了OpenSSL的库,如VOIP的OpenH323协议、Apache服务器和Linux安全模块等。
你可以选择下面这份清单里的任何一种加密算法配合OpenSSL程序对文件加密。
● bf、bf-cbc、bf-cfb、bf-ecb、bf-ofb,Blowfish算法的各种变体。
● cast、cast-cbc,CAST算法两种采用不同编码方案的变体。cast5-cbc、cast5-cfb、cast5-ecb、cast5-ofb,CAST算法的改进版本,CAST5算法采用不同编码方案的变体数量更多。
● des、des-cbc、des-cfb、des-ecb、des-ede、des-ede-cbc、des-ede-cfb、des-ede-ofb、des-ofb,DES算法的众多变体中,有很多都是你平时用不上的。而且,DES现在已经不是最安全的加密算法了。
● des3、desx、des-ede3、des-ede3-cbc、des-ede3-cfb、des-ede3-ofb,DES3就是三重DES,它是DES算法的一种更先进、更安全的变体。
● idea、idea-cbc、idea-cfb、idea-ecb、idea-ofb,IDEA算法及其各种变体。
● rc2、rc2-cbc、rc2-cfb、rc2-ecb、rc2-ofb,RC2算法及其各种变体。
● rc4,RC4算法,无编码变体。
● rc5、rc5-cbc、rc5-cfb、rc5-ecb、rc5-ofb,RC5算法及其各种变体。
2.1.5 OpenSSL的组成
虽然OpenSSL使用SSL作为其名字的重要组成部分,但其实现的功能却远远超出了SSL协议本身。OpenSSL事实上包括了三部分:SSL协议、密码算法库和应用程序。
SSL协议部分完全实现和封装了SSL协议的三个版本和TLS协议,SSL协议库的实现是在密码算法库的基础上实现的。使用该库,你完全可以建立一个SSL服务器和SSL客户端。该部分在Linux下编译会形成一个名为libssl.a的库,在Windows下则是名为ssleay32.lib的库。
密码算法库是一个强大完整的密码算法库,它是OpenSSL的基础部分,也是很值得一般密码安全技术人员研究的部分,它实现了目前大部分主流的密码算法和标准。主要包括公开密钥算法、对称加密算法、散列函数算法、X.509数字证书标准、PKCS12、PKCS7等标准。事实上,OpenSSL的SSL协议部分和应用程序部分都是基于这个库开发的。目前,这个库除了可以使用本身的默认算法外,在0.9.6版本之后,还提供了Engine机制,用于将如加密卡这样外部的加密算法实现集成到OpenSSL中。密码算法库在Linux编译后其库文件名称为libcrypto.a。
应用程序部分是OpenSSL最生动的部分,也是OpenSSL使用入门的部分。该部分基于上述的密码算法库和SSL协议库实现了很多实用和示例性的应用程序,覆盖了众多的密码学应用。主要包括了各种算法的加密程序和各种类型密钥的产生程序(如RSA、Md5、Enc等)、证书签发和验证程序(如Ca、X.509、Crl等)、SSL连接测试程序(如S_client和S_server等),以及其他的标准应用程序(如Pkcs12和Smime等)。