[PKI]SSL基础
很多概念搞不清了,备忘一下。
一.协议的起源
随着计算机网络技术向整个经济社会各层次延伸,整个社会表现对Internet、Intranet、Extranet等使用的更大的依赖性。随着企业间信息交互的不断增加,任何一种网络应用和增值服务的使用程度将取决于所使用网络的信息安全有无保障,网络安全已成为现代计算机网络应用的最大障碍,也是急需解决的难题之一。
由于Web上有时要传输重要或敏感的数据,因此Netscape公司在推出Web浏览器首版的同时,提出了安全通信协议SSL(Secure Socket Layer),目前已有2.0和3.0版本。SSL采用公开密钥技术。其目标是保证两个应用间通信的保密性和可靠性,可在服务器和客户机两端同时实现支持。目前,利用公开密钥技术的SSL协议,并已成为Internet上保密通讯的工业标准。现行Web浏览器普遍将HTTP和SSL相结合,从而实现安全通信。
二.协议概述
安全套接层协议(SSL)是在Internet基础上提供的一种保证私密性的安全协议。它能使客户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对客户进行认证。SSL协议要求建立在可靠的传输层协议(例如:TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的。高层的应用层协议(例如:HTTP,FTP,TELNET。。。。。。)能透明的建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商以及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
通过以上叙述,SSL协议提供的安全信道有以下三个特性:
; 私密性。因为在握手协议定义了会话密钥后,所有的消息都被加密。
; 确认性。因为尽管会话的客户端认证是可选的,但是服务器端始终是被认证的。
; 可靠性。因为传送的消息包括消息完整性检查(使用MAC)。
三.协议规范
SSL协议由SSL记录协议和SSL握手协议两部分组成。
1. SSL记录协议:
在SSL协议中,所有的传输数据都被封装在记录中。记录是由记录头和长度不为0的记录数据组成的。所有的SSL通信包括握手消息、安全空白记录和应用数据都使用SSL记录层。SSL记录协议包括了记录头和记录数据格式的规定。
1) SSL记录头格式:
SSL的记录头可以是两个或三个字节长的编码。SSL记录头的包含的信息包括:记录头的长度、记录数据的长度、记录数据中是否有粘贴数据。其中粘贴数据是在使用块加密算法时,填充实际数据,使其长度恰好是块的整数倍。最高位为1时,不含有粘贴数据,记录头的长度为两个字节,记录数据的最大长度为32767个字节;最高位为0时,含有粘贴数据,记录头的长度为三个字节,记录数据的最大长度为16383个字节。
当数据头长度是三个字节时,次高位有特殊的含义。次高位为1时,标识所传输的记录是普通的数据记录;次高位为0时,标识所传输的记录是安全空白记录(被保留用于将来协议的扩展)。
记录头中数据长度编码不包括数据头所占用的字节长度。记录头长度为两个字节的记录长度的计算公式:记录长度=((byte[0] & 0x7f) << 8)) | byte[1]。其中byte[0]、byte[1]分别表示传输的第一个、第二个字节。记录头长度为三个字节的记录长度的计算公式:记录长度=((byte[0] & 0x3f) << 8)) | byte[1]。其中byte[0]、byte[1]的含义同上。判断是否是安全空白记录的计算公式:(byte[0] & 0x40) != 0。粘贴数据的长度为传输的第三个字节。
2) SSL记录数据的格式:
SSL的记录数据包含三个部分:MAC数据、实际数据和粘贴数据。
MAC数据用于数据完整性检查。计算MAC所用的散列函数由握手协议中的CIPHER-CHOICE消息确定。若使用MD2和MD5算法,则MAC数据长度是16个字节。MAC的计算公式:MAC数据=HASH[密钥,实际数据,粘贴数据,序号]。当会话的客户端发送数据时,密钥是客户的写密钥(服务器用读密钥来验证MAC数据);而当会话的客户端接收数据时,密钥是客户的读密钥(服务器用写密钥来产生MAC数据)。序号是一个可以被发送和接收双方递增的计数器。每个通信方向都会建立一对计数器,分别被发送者和接收者拥有。计数器有32位,计数值循环使用,每发送一个记录计数值递增一次,序号的初始值为0。
2. SSL握手协议:
SSL握手协议包含两个阶段,第一个阶段用于建立私密性通信信道,第二个阶段用于客户认证。
1) 第一阶段:
第一阶段是通信的初始化阶段,通信双方都发出HELLO消息。当双方都接收到HELLO消息时,就有足够的信息确定是否需要一个新的密钥。若不需要新的密钥,双方立即进入握手协议的第二阶段。否则,此时服务器方的SERVER-HELLO消息将包含足够的信息使客户方产生一个新的密钥。这些信息包括服务器所持有的证书、加密规约和连接标识。若密钥产生成功,客户方发出CLIENT-MASTER-KEY消息,否则发出错误消息。最终当密钥确定以后,服务器方向客户方发出SERVER-VERIFY消息。因为只有拥有合适的公钥的服务器才能解开密钥。下图为第一阶段的流程:
需要注意的一点是每一通信方向上都需要一对密钥,所以一个连接需要四个密钥,分别为客户方的读密钥、客户方的写密钥、服务器方的读密钥、服务器方的写密钥。
2) 第二阶段:
第二阶段的主要任务是对客户进行认证,此时服务器已经被认证了。服务器方向客户发出认证请求消息:REQUEST-CERTIFICATE。当客户收到服务器方的认证请求消息,发出自己的证书,并且监听对方回送的认证结果。而当服务器收到客户的认证,认证成功返回SERVER-FINISH消息,否则返回错误消息。到此为止,握手协议全部结束。
3. 典型的协议消息流程:
消息名 方向 内容
不需要新密钥
CLIENT-HELLO C->S challenge, session_id, cipher_specs
SERVER-HELLO S->C connection-id, session_id_hit
CLIENT-FINISH C->S Eclient_write_key[connection-id]
SERVER-VERIFY S->C Eserver_write_key[challenge]
SERVER-FINISH S->C Eserver_write_key[session_id]
需要新密钥
CLIENT-HELLO C->S challenge, cipher_specs
SERVER-HELLO S->C connection-id,server_certificate,cipher_specs
CLIENT-MASTER-KEY C->S Eserver_public_key[master_key]
CLIENT-FINISH C->S Eclient_write_key[connection-id]
SERVER-VERIFY S->C Eserver_write_key[challenge]
SERVER-FINISH S->C Eserver_write_key[new_session_id]
需要客户认证
CLIENT-HELLO C->S challenge, session_id, cipher_specs
SERVER-HELLO S->C connection-id, session_id_hit
CLIENT-FINISH C->S Eclient_write_key[connection-id]
SERVER-VERIFY S->C Eserver_write_key[challenge]
REQUEST-CERTIFICATE S->C Eserver_write_key[auth_type,challenge']
CLIENT-CERTIFICATE C->S Eclient_write_key[cert_type,client_cert,response_data]
SERVER-FINISH S->C Eserver_write_key[session_id]
四.相关技术:
1. 加密算法和会话密钥:
如前所述,加密算法和会话密钥是在握手协议中协商并有CIPHER-CHOICE指定的。现有的SSL版本中所用到的加密算法包括:RC4、RC2、IDEA和DES,而加密算法所用的密钥由消息散列函数MD5产生。RC4、RC2是由RSA定义的,其中RC2适用于块加密,RC4适用于流加密。下述为CIPHER-CHIOCE的可能取值和会话密钥的计算:
SSL_CK_RC4_128_WITH_MD5
SSL_CK_RC4_128_EXPORT40_WITH_MD5
SSL_CK_RC2_128_CBC_WITH_MD5
SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5
SSL_CK_IDEA_128_CBC_WITH_MD5
KEY-MATERIAL-0 = MD5[ MASTER-KEY, "0", CHALLENGE, CONNECTION-ID ]
KEY-MATERIAL-1 = MD5[ MASTER-KEY, "1", CHALLENGE, CONNECTION-ID ]
CLIENT-READ-KEY = KEY-MATERIAL-0[0-15]
CLIENT-WRITE-KEY = KEY-MATERIAL-1[0-15]
SSL_CK_DES_64_CBC_WITH_MD5
KEY-MATERIAL-0 = MD5[ MASTER-KEY, CHALLENGE, CONNECTION-ID ]
CLIENT-READ-KEY = KEY-MATERIAL-0[0-7]
CLIENT-WRITE-KEY = KEY-MATERIAL-0[8-15]
SSL_CK_DES_192_EDE3_CBC_WITH_MD5
KEY-MATERIAL-0 = MD5[ MASTER-KEY, "0", CHALLENGE, CONNECTION-ID ]
KEY-MATERIAL-1 = MD5[ MASTER-KEY, "1", CHALLENGE, CONNECTION-ID ]
KEY-MATERIAL-2 = MD5[ MASTER-KEY, "2", CHALLENGE, CONNECTION-ID ]
CLIENT-READ-KEY-0 = KEY-MATERIAL-0[0-7]
CLIENT-READ-KEY-1 = KEY-MATERIAL-0[8-15]
CLIENT-READ-KEY-2 = KEY-MATERIAL-1[0-7]
CLIENT-WRITE-KEY-0 = KEY-MATERIAL-1[8-15]
CLIENT-WRITE-KEY-1 = KEY-MATERIAL-2[0-7]
CLIENT-WRITE-KEY-2 = KEY-MATERIAL-2[8-15]
其中KEY-MATERIAL-0[0-15]表示KEY-MATERIAL-0中的16个字节,KEY-MATERIAL-0[0-7]表示KEY-MATERIAL-0中的头8个字节,KEY-MATERIAL-1[8-15]表示KEY-MATERIAL-0中的第9个字节到第15个字节。其他类似形式有相同的含义。"0"、"1"表示数字0、1的ASCII码0x30、0x31。
2. 认证算法:
认证算法采用X。509电子证书标准,通过使用RSA算法进行数字签名来实现的。
1) 服务器的认证:
在上述的两对密钥中,服务器方的写密钥和客户方的读密钥、客户方的写密钥和服务器方的读密钥分别是一对私有、公有密钥。对服务器进行认证时,只有用正确的服务器方写密钥加密CLIENT-HELLO消息形成的数字签名才能被客户正确的解密,从而验证服务器的身分。
若通信双方不需要新的密钥,则它们各自所拥有的密钥已经符合上述条件。若通信双方需要新的密钥。首先服务器方在SERVER-HELLO消息中的服务器证书中提供了服务器的公有密钥,服务器用其私有密钥才能正确的解密由客户方使用服务器的公有密钥加密的MASTER-KEY,从而获得服务器方的读密钥和写密钥。
2) 客户的认证:
同上,只有用正确的客户方写密钥加密的内容才能被服务器方用其读密钥正确的解开。当客户收到服务器方发出的REQUEST-CERTIFICATE消息时,客户首先使用MD5消息散列函数获得服务器方信息的摘要,服务器方的信息包括:KEY-MATERIAL-0、KEY-MATERIAL-1、KEY-MATERIAL-2、CERTIFICATE-CHALLENAGE-DATA(来自于REQUEST-CERTIFICATE消息)、服务器所赋予的证书(来自于SERVER-HELLO)消息。其中KEY-MATERIAL-1、KEY-MATERIAL-2是可选的,与具体的加密算法有关。然后客户使用自己的读密钥加密摘要形成数字签名,从而被服务器认证。
五.与SET协议的比较
在当今的电子商务中使用最为广泛的两种安全协议是SSL协议和SET协议。以下就两种协议在电子商务方面的应用作一比较。
1. SET协议概述:
SET协议(Secure Electronic Transaction,安全电子交易)是由VISA和MasterCard两大信用卡公司于1997年5月联合推出的规范。SET主要是为了解决用户、商家和银行之间通过信用卡支付的交易而设计的,以保证支付信息的机密、支付过程的完整、商户及持卡人的合法身份、以及可操作性。SET中的核心技术主要有公开密匙加密、电子数字签名、电子信封、电子安全证书等。SET能在电子交易环节上提供更大的信任度、更完整的交易信息、更高的安全性和更少受欺诈的可能性。SET协议用以支持B to C(Businessto Consumer)这种类型的电子商务模式,即消费者持卡在网上购物与交易的模式。SET交易分三个阶段进行:
; 在购买请求阶段,用户与商家确定所用支付方式的细节;
; 在支付的认定阶段,商家会与银行核实,随着交易的进展,他们将得到付款;
; 在受款阶段,商家向银行出示所有交易的细节,然后银行以适当方式转移货款。
如果不是使用借记卡,而直接支付现金,商家在第二阶段完成以后的任何时间即可以供货支付。第三阶段将紧接着第二阶段进行。用户只和第一阶段交易有关,银行与第二、三阶段有关,而商家与三个阶段都要发生关系。每个阶段都涉及到RSA对数据加密,以及RSA数字签名。使用SET协议,在一次交易中,要完成多次加密与解密操作,故要求商家的服务器有很高的处理能力。
2. 协议比较:
事实上,SET和SSL除了都采用RSA公钥算法以外,二者在其他技术方面没有任何相似之处。而RSA在二者中也被用来实现不同的安全目标。
SET协议比SSL协议复杂,因为SET不仅加密两个端点间的单个会话,它还非常详细而准确地反映了卡交易各方之间存在的各种关系。SET还定义了加密信息的格式和完成一笔卡支付交易过程中各方传输信息的规则。事实上,SET远远不止是一个技术方面的协议,它还说明了每一方所持有的数字证书的合法含义,希望得到数字证书以及响应信息的各方应有的动作,与一笔交易紧密相关的责任分担。SET实现起来非常复杂,商家和银行都需要改造系统以实现互操作。另外SET协议需要认证中心的支持。
SET是一个多方的报文协议,它定义了银行、商家、持卡人之间的必须的报文规范,与此同时SSL只是简单地在两方之间建立了一条安全连接。SSL是面向连接的,而SET允许各方之间的报文交换不是实时的。SET报文能够在银行内部网或者其他网络上传输,而SSL之上的卡支付系统只能与Web浏览器捆绑在一起。
两者相比最不安全的可以说是SSL,实际上当初它并不是为支持电子商务而设计的,后来为了克服其局限性在其基础上发展了PKI。然而就当初的设计目的而言,SSL和它的继任者— —传输层安全协议(the transport layer security protocol)的功能完成的非常圆满。很多银行和电子商务解决方案提供商还在谈论着使用SSL构建更多的安全支付系统,但是如果没有经裁剪的客户方软件的话,基于SSL的系统是不能到像SET这种专用银行卡支付协议所能达到的安全性的。
六.前景展望
就我个人观点来说,SSL协议与SET协议之争类似于IP与ATM之争。IP协议的应用非常广泛,实现简单成本低廉,但服务质量没有保证。ATM实现复杂,需要对现有的设备和应用进行改造,成本高昂,但对服务质量有保证。结果是ATM迟迟不能推出成熟的规范,IP设备迅速抢占市场。随着应用需求的增加和扩展,对服务质量要求的呼声也日益高涨。这时CISCO等厂商也提出IP上的QoS,并且通过扩展IP协议实现对QoS的支持。所以评价一种技术的前景,最重要的就是这种技术能不能在现有的条件下占有市场。至于这种技术是不是先进、是不是有好的扩展性等等相对来说处于次要地位。从已有的应用份额、实现成本、技术支持等影响市场占有率的最重要的因素来看,SSL协议已经占据了有利的形势。我对SSL协议的发展充满乐观。