使用SCEP为SSL提供证书服务

杨扬,马跃北京邮电大学计算机科学与技术学院,北京(100876)E-mail :摘 要:SSL 作为目前流行的保障信息安全的协议,具有保密性、消息完整性和端点认证等特性。本文使用SCEP 模块为SS

杨扬,马跃

北京邮电大学计算机科学与技术学院,北京(100876)

E-mail :

摘 要:SSL 作为目前流行的保障信息安全的协议,具有保密性、消息完整性和端点认证等特性。本文使用SCEP 模块为SSL 提供端点认证的特性,它作为路由器上的一个模块,向CA 服务器提出请求,为通信双方提供身份认证。

关键词:SCEP ,SSL ,CA 服务器,CRL

中图分类号:TP393

1. 引言

SCEP [1](Simple Certificate Enrollment Protocol)是一种证书解决方案,目前广泛应用于PKI client和CA 实现。SCEP 中有三种实体:终端实体、数字证书认证中心(CA )和审核授权部门(RA )。终端实体是指在证书的subject name域或者在X.509 V3[2]扩展版本中subjectAltName 域中定义名字的实体。它的功能是产生一对非对称RSA 密钥,发起证书申请或者证书查询请求。CA 是证书的颁发机构,是PKI 的核心,职责是接收终端用户的申请,决定是否为其颁发证书;处理证书的更新请求;处理证书的查询请求;发布CRL 等。RA 协助CA 负责为已授权的证书申请者制作、发放和管理证书,在RA 存在的情况下,终端实体通过RA 提出证书申请,此时终端实体除了获得CA 自签名证书外,还要获得由CA 颁发的RA 证书。

SCEP 模块模块

SSL 模块

TCP 模块

图1 SCEP模块在路由器中的位置

在建立SSL 连接的过程中,有两处需要提供证书服务。一处是SSL 服务器向客户端发送证书来证明自己的身份时,这就需要SSL 服务器拥有自己的数字证书;另外一处是如果SSL 服务器选择了客户端认证,那么它在获得客户端证书时就需要认证客户端证书的可靠性。由于验证证书需要耗费大量的时间,如果一个SSL 服务器同时为多个客户端服务,验证每个客户端的证书将耗费大量的服务器时间,降低了服务器的效率。因此,对客户端身份的验证往往不使用证书,而是通过其他的方式完成,比如用户名/口令等。所以本文只讨论SCEP 为SSL 申请数字证书的情况,SCEP 模块在系统中的位置可以用图1表示。

2. 为SSL 服务器申请证书

SSL 连接中进行服务器验证,首先要保证服务器拥有数字证书,申请证书的过程由SCEP 模块完成,申请成功后将证书送至SSL 信箱,SSL 模块可以将证书存储在内存中,启动SSL 模块时自动加载证书,而无需每次重新申请证书。

SCEP 在申请证书前需要具备以下两个前提条件:具有一对RSA 密钥;已知CA 服务器

- 1 -

,

图2

网路拓扑结构图

SCEP 在获取数字证书之前,必须先获得CA 服务器证书(若RA 存在,还需获得RA 证书),而此时SCEP 和CA 之间没有公钥交换,不能进行加密通信,因此使用HTTP 协议来获得证书。获取CA 服务器证书的过程可以用两条消息完成:SCEP 请求者发送给CA 服务器的GetCACert [1]消息和CA 服务器返回的CertRep [1]消息,如图3所示。

图3 SCEP 请求CA 服务器的证书

2.1 GetCACert

路由器R 与myca 建立TCP 连接之后, SCEP发送HTTP GET:

一旦接收到CA 证书,SCEP 必须使用“指纹”[1]来验证证书是否可信。“指纹”是对整个

- 2 -

,

验证过CA 证书之后,SCEP 就可以为SSL 服务器注册证书了。证书注册过程由两条消息构成,一条是SCEP 发送给CA 服务器的PKCSReq [1]消息,另外一条是CA 服务器返回的CertRep [1]消息,如图4所示。

图4 SCEP 向CA 服务器请求CA 证书

2.1.1 PKCSReq消息

PKCSReq 消息的内容是添加了签名的PKCS 证书请求。PKCSReq 的生成过程(如图5所示)如下:

1.终端实体(本文中是路由器R 上的SCEP 模块)创建一个自签名的证书,包括的主

题名、主题公钥信息和属性等信息,然后使用与主题公钥相对应的私钥对证书请求进行签名,签名后的证书请求组成了证书请求信封的信息部分。

2.使用随机生成的内容加密密钥key 来加密这个PKCS #10证书请求,再把这个内

容加密密钥key 用用于加密的RA 密钥加密后放在接收者信息域中,就形成了PKCS #7证书请求信封。

3.生成一个唯一的字符串作为操作ID 。此ID 标识一个PKI 操作,在同一次PKI 操作

中,终端实体和CA 交换的信息中的操作ID 都是相同的。

4.生成一个16字节的随机数作为SenderNonce ,防止重放攻击。

5.使用选定的消息摘要算法计算添加信封后的PKCS 注册请求的消息摘要。

6.在签名数据中添加请求者的自签名证书和签名者信息。将操作ID 、SenderNonce 和

上一步产生的摘要组成鉴定属性,用终端实体的私钥签名,添加到签名数据中,就完成了SignedData 。

7.使用ContentInfo 指明这个SignedData 对象,就组成了完整的PKCSReq PKI消息。 SCEP 终端实体生成PKCSReq 消息之后,先后用DER 和Base64编码方式编码,假设编码后的内容是msg ,然后发送HTTP GET :

- 3 -

,

图5 证书请求消息PKCSReq 的生成过程

2.1.2 CertRep

CA 服务器收到PKCSReq 消息之后,会验证请求者的身份,这里有两种验证方式:手工验证和自动验证。Windows2003服务器支持这两种验证方式,可以在服务器中设置。先介绍一下人工验证方式,在CA 服务器管理员通过请求之前,证书请求信息会出现在CA 服务器的挂起请求列表中,并且CA 服务器会返回一个CertRep 消息返回给SCEP 。此时的CertRep 消息的pkiStatus 域为PENDING ,表示尚未通过管理员验证,此时登陆CA 服务器可以看到证书请求的状态,处在“挂起的申请”列表中,如图6所示,申请ID 为4的证书请求出现在“挂起的请求列表中”:

图6 尚未通过手工验证的证书请求的状态

图7 手工验证证书请求的过程

- 4 -

,

1.FAILURE 消息

此消息表示验证过程中出现了错误,请求被拒绝,证书请求出现在“失败的申请”列表中。此时消息中的失败信息中会给出失败原因,一般有以下几种:

badAlg :使用了不能识别或者不支持的算法

badMessageCheck :对消息完整性的验证失败

badrequest:不被允许或者不支持的交易

badTime :消息时间与系统时间不符

badCertId :找不到匹配的证书

2.SUCCESS 消息

若请求者通过了验证,则证书请求会出现在“颁发的证书”列表中,如图8所示:

[1][1]

图8 已经通过CA 管理员验证的证书请求的状态

图9 CertRep消息的格式

从图8可以看出,申请ID 为4的证书请求已经移到了“颁发的证书”列表中。而此时SCEP 也会收到一个CertRep 消息,消息的信息部分就是一个包含所请求的证书的退化的PKCS #7数据,此数据包括在PKCS #7信封中,除此之外还包括CA 服务器证书和签名信息。证

- 5 - [4]

,

如果服务器使用自动验证方式,则不会收到PENDING 类型的CertRep 消息,也无须周期性发送GetInitialCert 了。自动验证是基于对pre-share secret的检验,pre-share secret是CA 服务器为每一个终端实体颁发的唯一的share secret,这个密钥对应该终端实体的注册请求,只有该终端实体知道这个密钥,当终端实体提出注册请求时,要将这个密钥填进PKCS#10属性域,再经过PKCS #7的封装,加密发送给CA 服务器。CA 服务器提取密钥并与自己保存的密钥进行比较,从而鉴别终端实体的身份。

到目前为止,SCEP 已经成功的从CA 证书服务器取得了一个证书,它将这个证书提取出来之后,发到SSL 信箱中,SSL 就可以直接使用,在Certificate 消息中发送这个证书。 [5]

3. SCEP提供的其他服务

SCEP 除了完成证书请求的功能外,还可以提出证书查询,请求CRL ,下面简单地介绍一下这两个功能。

3.1证书查询

证书查询[1]有两个用途:有些客户端没有存储证书的能力,这时CA 服务器会替客户存储这些证书,客户需要时可以向CA 服务器提出证书查询,查询自己的证书;另外一个用途是客户可以使用证书查询功能来查询其他客户的证书。证书查询有两种方式:使用LDAP 协议存取或者向CA 服务器发送查询请求,我们这里介绍第二种方式。查询过程有两条消息组成:GetCert 和CertRep 。GetCert 消息的构成和GetCACert 消息的组成类似,只是此时GetCert 信封中被加密的内容变成了要查询的证书的颁发者和序列号(如图10所示),这是因为证书使用其颁发者和序列号来唯一地标识自己。在生成了GetCert 消息之后,再对其使用DER 和Base64编码方式编码,假设编码后的内容是msg ,使用HTTP GET:

摘要算法

数据类型标识

用CA 公钥加密后的key

加密算法

用key 加密的证书序列号和颁发者名字

终端实体证书

签名信息 [2]

图10 证书查询消息GetCert 的格式

3.2 请求CRL

我们知道SSL 另外一个用到证书服务的地方是验证客户端证书,虽然我们在实际应用中没有用到这个服务,但SCEP 还是可以为SSL 提供这个服务的,这个功能的实现需要向CA 服务器请求CRL [1],如果客户端证书出现在CRL 中,说明这个客户端证书无效,可能证书过期或者用户吊销了证书,这是SSL 可以取消连接建立过程,否则,说明客户端证书可

- 6 -

,

证书的Certificate 消息,这时SSL 服务器可以继续建立连接或者取消连接返回失败信息。 CRL 是由CA 发行者的名字和CA 证书序列号标识的,因此在请求CRL 时,必须提供这两个信息。

SCEP 对CRL 的请求同样通过两条消息完成:GetCRL 消息和CertRep 。本文的环境中,若是请求CA 服务器test 的CRL ,则要在生成GetCRL 消息之后,使用HTTP GET http:/13.1.1.1/CertEnrolll/test.crl/发送CRL 请求(注意这里使用的HTTP GET与前面的有所不同)。这里的CertRep 消息返回的是撤销证书列表[2],列表中的每项由用户证书序列号和撤销日期组成,其格式如图11所示。

[5]

图11 CRL 格式

4. 结论

本文以SSL 服务器获取证书为例讨论了SCEP 的一些功能,其实SCEP 还可以为其他需

要证书的模块提供服务,如IPSEC 等。SCEP 解决了建立安全通道时验证通信双方身份的问题,使用PKCS #10、PKCS #7协议与数据加密和数字签名相结合,从而在证书注册和颁发证书时,隐藏身份信息,抵抗中间人攻击。

参考文献

,

Yang Yang,Ma Yue

College of Computer Science & Technology,Beijing University of Posts and

Telecommunications ,Beijing (100876)

Abstract

SSL has characters of safety, message integrity and end authentication as a popular protocol ensuring information secure. This title uses SCEP module to offer end authentication for SSL, it is a module on router, send request to CA server, makes SSL server able to prove its identification.

Keywords :SCEP ,SSL ,CA Server,CRL

- 8 -

标签: