PKI技术多种多样,应用非常广泛;本章介绍这些基本技术。证书认证系统的设计与实现使用了以下典型PKI技术:数字证书、数字信封、微软CryptoAPI、SSL协议、LDAP标准、OCSP协议等。
数字证书[2](Digital certificate)是一种“网络身份证”,它由证书认证中心签发;它是一种包含持有者信息、持有者公钥、颁发者、颁发者签名等信息的电子文件。
为了适应PKI技术的发展,IETF制定在Internet上使用X.509和证书吊销列表(Certificate RevocationList,CRL)[3]的标准。X.509V3版本证书组成元素分析见图2-1。
通过以上分析,数字证书元素可由待签名证书主题(TBSCertificate)、证书签名算法标示(signatureAlgorithm)、证书签名值(signatValue)等组成。其中证书第二层元素包括版本号、序列号、证书有效期、颁发者DN、持有者DN等;证书第三层元素主要是一些常用的标准扩展。证书第四层元素主要是自定义扩展,来满足证书对不同应用的需要。证书认证系统提供证书全生命周期管理,也提供证书各个元素的生成。其中证书自定义扩展的满足是系统实现的难点,本论文会通过可配置的证书模板机制满足其实现(参考3.6节和4.3节的设计和实现)。
1)数字信封概念
数字信封[4](Digital Envelope)中采用了对称密码体制和公钥密码体制。信息发送者首先利用随机产生的对称密码加密信息,再利用接收方的公钥加密对称密码,被公钥加密后的对称密码被称之为数字信封。在传递信息时,信息接收方要解密信息时,必须先用自己的私钥解密数字信封,得到对称密码,才能利用对称密码解密所得到的信息。这样就保证了数据传输的真实性和完整性。
RSA公司的PKCS#7[5]标准定义了密码信息封装的语法,其包含数据(Data)格式、签名数据(Signed-data)格式、信封数据(Enveloped-data)格式、签名且信封数据(Signed-and-enveloped-data)格式、杂凑数据( Digested-data)格式、加密数据(Enveloped-data)等6种格式。
2)PKCS#7中信封数据(Enveloped-data)格式元素分析
图2-2 PKCS#7组成元素分析图
其中对称密钥加密算法(Key Encryption Algorithm)指用什么算法加密对称密钥;已加密密钥(Encrypted Key)指用接收方公钥加密后的对称密钥密文;信信封加密算法(Contentencryption algorithm)指用什么算法加密数据;已加密数据(Encrypted content)指用对称密钥加密数据以后的密文。
(1)CryptoAPI简介
微软CryptoAPI[6]是PKI推荐使用的加密 API。其功能是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI处于应用程序和CSP(CryptographicService Provider)之间。CSP是一个真正执行加密功能的独立模块,典型的CSP有微软RSA Base Provider。目前任何一个加密服务提供者若想成为微软的合法的CSP,就必须获得微软授予的一个签名文件,该签名文件保证了微软CryptoAPI识别该CSP。
通过微软的CryptoAPI标准接口可以对CSP中的证书和私钥进行操作,因此掌握CSP原理以及CryptoAPI,将证书、私钥写入到CSP中具有重要意义。
(2)CryptoAPI框架结构
CryptoAPI共有五部分组成:简单消息函数(Simplified Message Functions)、低层消息函数(Low-levelMessage Functions)、基本加密函数(Base Cryptographic Functions)、证书编解码函数(Certificate Encode/Decode Functions)和证书库管理函数(Certificate Store Functions)。其中前三者可用于对敏感信息进行加密或签名处理,可保证网络传输信心的私有性;后两者通过对证书的使用,可保证网络信息交流中的认证性。
(1)SSL协议简介
安全套接层协议[7](Secure socket Layer,SSL)指使用公钥、私钥技术组合的安全网络通讯协议。SSL协议是网景公司(Netscape)推出的基于WEB应用的安全协议,SSL协议指定了一种在应用程序协议(如Http、Telnet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即确保数据的完整性。
SSL协议[8]由握手协议层和记录协议层组成,主要包括记录协议以及建立在记录协议之上的握手协议、警告协议、更改密码说明协议和应用数据协议等可以对会话和管理提供支持的子协议。
(2)SSL握手流程
SSL握手协议[9]完成了身份的建立和密钥的交换。在握手过程中,客户端和服务器产生一个共享的会话密钥,可以验证彼此的身份。这个过程通过交换一系列的消息来完成。
图2-4 SSL协议握手步骤图
其具体步骤描述如下:
(1)客户端发出一条Client_ hello的消息,消息内容包括:客户端支持的SSL版本号、客户端产生的32字节随机数、一个对等的会话ID、客户端支持的密钥算法的列表等。
(2)服务器发出消息Server_hello进行响应,内容包括:服务器从客户端列表中选定的SSL版本号、服务器产生的32字节的随机数、会话ID、从客户端列表中选择的密码算法。服务器发送它的X.509证书,其中包括了服务器所有者的信息和服务器的公钥,客户端可以使用这个公钥向服务器发送加密的消息。只有与这个证书对应的私钥的所有者才能够对这些消息进行解密。同时,服务器可以向客户端请求证书。这个步骤是可选的,如不选,客户端被称为匿名。最后,服务器发送消息Server_hello_done,表示完成了通信步骤,等待来自客户端的应答。
(3)客户端检查服务器的证书和它发送的参数。如果服务器请求客户端证书,那么客户端响应一条证书消息,其中包含了它的X.509证书。客户端发送Client_key_exchange,这是一个随机数,客户端和服务器使用它来建立会话密钥。这个随机数产生于客户端和服务器在前面的通信步骤中交换的随机数,它使用服务器的公钥和RSA算法进行加密。如果客户端提供证书,那么将发送Certificate_verify消息。客户端对发送的所有消息进行Hash运算,并且使用自己的私钥进行签名,这样服务器就可以验证客户端确实持有与客户证书相对应的私钥。然后,客户端计算使用的加密密钥,另外还计算一个用于消息认证码(MAC)的密钥,这个密钥可以用来验证数据完整性。这些密钥产生于客户端和服务器端在前面步骤中交换的秘密随机数。客户端发送Change_cipher_spec消息,表示将使用这些密码算法和参数处理将来的通信,但是客户端不需将密钥告诉服务器,因为服务器可以使用前面交换的同样的随机数,独立的计算出这些密钥。最后,客户端发送交换结束消息,使用了会话密钥进行加密,并且包含了校验完整性的MAC内容。
(4)服务器以它的Change_cipher_spec消息作为响应,向客户端显示它也将使用与客户端相同的参数来加密将来所有的通信内容。服务器发送交换结束消息来结束握手过程,这个消息使用协商好的密钥进行加密。在此之前,所有的加密操作都使用非对称加密方式完成。客户端与服务器之间后续的通信部分现在都可以使用对称加密算法来加密。1)LDAP简介
轻量级目录访问协议[10] (Lightweight Directory Access Protocol,LDAP)技术是一种标准的目录服务技术,它基于X.500标准。X.500是一种OSI的目录服务模型,这个模型包括了所有的命名空间和查询更新协议,X.500通常也被称作“DAP”(DirectoryAccess Protocol),这个协议运行在OSI网络协议层,功能及其强大,但是也由于丰富的数据模型和操作使得它非常复杂而显得笨重。LDAP相对而言比较的简单,并且它可以根据应用的需要进行定制和扩展。与X.500最大的不同在于,LDAP一开始就设计为运行在TCP/IP协议上,是目录服务在TCP/IP上的实现(RFC 1777 V2版和RFC 2251 V3版)。因此LDAP对于Internet访问的支持非常好,并且它还为浏览和查找目录以及内容读取提供了专门的优化,使得读取速度比一般的关系数据库要快得多。
LDAP标准定义了在目录中访问信息的协议,规定了信息的形式和特性、信息存放的索引和组织方式、分布式的操作模型,并且还指明LDAP协议本身和信息模型都是可被扩展的。LDAP目录中可以存放各种类型的数据,包括并不仅限于下列几种:简单文本、图片信息、URLs、二进制数据、数字证书等。不同类型的数据存放在不同类型的属性中,每一种属性有其特定的语法。LDAP标准基于X.500的子集提供了一套丰富的属性类型和语法,但是,又提供了自定义属性、语法、甚至是对象类型的能力。目录中的信息存放模型基于项(Entry),每个项拥有全局唯一的名字(DN)并且包含了基于属性的描述信息。项的存放基于树状模型,层次结构相当明晰,适于对应现实世界的组织模型。LDAP也为信息的检索提供了复杂的过滤条件,并且提供了相当的访问控制能力。
LDAP中可以大量存放个人的信息。例如,一个机构可以将他所有员工的信息存放在LDAP目录中,供所有人员查阅。个人信息中可以包含有个人的姓名、职务、住址等等。通过把LDAP目录作为系统集成中的一个重要环节,可以简化员工在机构内部查询信息的步骤,而数据源可以放在任何地方。
LDAP从设计开始发展到现在,已经在全世界范围内广泛流行,成为一个成熟并且通用的服务。大型企业普遍采用LDAP作为存放企业和员工信息的场所,各种应用程序也都能通过LDAP提供的C或者JAVA的API去从LDAP目录中获取所需信息。
2)SCHEMA
Schema[11]是LDAP的一个重要组成部分,类似于数据库的模式定义,LDAP的Schema定义了LDAP目录所应遵循的结构和规则。比如一个 objectclass会有哪些属性,这些属性又是什么结构等等,schema给LDAP服务器提供了LDAP目录中类别,属性等信息的识别方式,让这些可以被LDAP服务器识别。
在LDAP的schema中,有四个重要的元素:
1、对象类(Objectclass)
Objectclass定义了一个类别,这个类别会被不同的目录(在LDAP中就是一个Entry)用到,它说明了该目录应该有哪些属性,哪些属性是必须的,哪些又是可选的。一个Objectclass的定义包括名称(NAME),说明(DESC),类型(STRUCTURAL或AUXILARY ,表示是结构型的还是辅助型的),必须属性(MUST),可选属性(MAY)等信息。
2、属性(Attribute)
Attribute就是一个上面Objectclass中可能包含的属性,对其的定义包括名称,数据类型,单值还是多值以及匹配规则等。后面用具体的例子来说明。
3、语法(Syntax)
Syntax是LDAP中的“语法”,其实就是LDAP中会用到的数据类型和数据约束,这个语法是遵从X.500中数据约束的定义的。其定义需要有一个ID(遵从X.500)以及说明(DESP)
4、匹配规则(Matching Rules)
是用来指定某属性的匹配规则,实际上就是定义一个特殊的Syntax的别名,让LDAP服务器可以识别,并对定义的属性进行匹配。
LDAP的schema的主要元素就是这些了,下面列举出了一些LDAP规定好的或是现在比较通用的schema,一般的LDAP服务器都应该可以识别这些定义。
(1)OCSP协议简介
在线证书状态协议[12](OnlineCertificate Status Protocol,OCSP),是IETF颁布的用于检查数字证书在某一交易时间是否有效的标准(RFC2560)。OCSP协议不是一个可以直接传输的网络协议,它必须利用其他协议传输方可执行,在标准中,有提到可以建立在HTTP、SMTP、LDAP(可以通过ExtendedRequest信息传送)的协议传输OCSP信息。OCSP共定义两道信息,Client端发送一个服务请求信息(OCSPReque)、服务器端回复应答信息(OCSPResponse)。
通过LDAP下载CRL、通过OCSP直接查询证书状态这个解决方案各有利弊。通过LDAP下载CRL方案适合网上商家,必须随时面对大量客户时使用。可以利用带宽空闲时间下载CRL,以减少CRL下载时间。至于一般使用者,并不是随时需要面对大量且不同对象,下载CRL就变成了一个很大的负担,所以使用简单的OCSP协议,就显得效率高了。另外OCSP协议一般实时性也比较强。
(2)OCSP协议元素分析
A)OCSP协议请求报文元素关系图
图2-5 OCSP协议请求报文元素分析图
由OCSP请求 [13](OCSPRequest)可以看出,客户端主要组织的信息由协议版本(version)、请求者证书标识(requestorName)、待查询证书集合(requestList)、请求扩展(requestExtensions)、请求签名(optionalSignature)等。在证书标识(CertID)元素中存放待查询证书信息(证书颁发者DN的Hash信息、证书颁发者公钥的Hash信息、待查询证书序列号)。一次请求可以查询多个证书状态。B)OCSP协议应答报文元素关系图
图2-5OCSP协议应答报文元素分析图
由OCSP应答(OCSPResponse)可以看出,服务器端主要组织的信息由协议版本(version)、响应器名称(responderID)、报文产生时间(producedAt)、证书状态回复(responses)、可选扩展(responseExtensions)、签名算法对象标识符号(signatureAlgorithm)、对回复信息散列后的签名(signature)等。一次应答可以返回多个证书状态。
此次更新(thisUpdate)和下次更新(nextUpdate)域定义了一个推荐的有效期。此时间长度和证书撤消列表中的{此次更新,下次更新}时间长度相一致。报文产生时间(producedAt)可以防止重放攻击。