来源:互联网
一、引言
公钥基础设施(public key infrastructure,简称PKI)是目前网络安全建设的基础与核心,为电子商务、电子政务等应用提供安全服务的基础平台[1]。证书状态查询是PKI系统中一个重要的环节,最常用的两种方法[2]是离线的基于CRL(Certificate Revoke List,证书撤销列表)的查询机制和基于OCSP(Online Certificate Status Protocol,在线证书状态协议)的实时查询机制。CRL机制是由CA(Certification Authority,认证中心)定期发布CRL,验证者定期查询和下载CRL,根据CRL来判断所要查询的证书的有效性;OCSP机制是由OCSP客户端发送一个证书状态查询给OCSP响应器,等待响应器返回一个证书查询状态的响应。
OCSP要求对应答消息中的基本OCSP应答进行数字签名,而数字签名运算所消耗的资源和时间较大,使其成为OCSP服务器实现中的性能瓶颈,甚至成为拒绝服务(DoS)攻击的攻击点。许多对OCSP协议的研究集中在如何提高OCSP的响应效率,从而既能及时地为用户提供证书撤销最真实的信息,又能减少由于请求等待时间过长而丢失请求信息的现象。
由上海信息安全工程技术研究中心和国家信息安全工程技术研究中心研发的SOCSP [3](Simple Online Certificate Status Protocol,简易在线证书状态协议)目的是解决在安全认证系统中使用OCSP协议所遇到的实效太慢的弊端,为我国电子政务和电子商务以及网络安全认证系统提供简单、快捷的证书状态查询协议。它去除了标准OCSP中的签名密码算法,采用MAC密码算法来代替,以提高OCSP的响应速率。简易在线证书状态协议SOCSP在2006年12月提交了送审稿,该文中定义的请求和响应没有设置随机数和时间戳字段[4],无法有效地检查和抵御重放攻击;另外,MAC算法的定义不详细,有可能导致系统兼容性问题。
2009年提交了SOCSP标准报批稿,该协议在请求和响应中都增加了一个随机数random字段,用于防止重放攻击;MAC算法统一使用国家标准规定的HMAC算法,定义比较详细,对送审稿中存在的两个问题可以有效解决。但是,该版标准报批稿的响应数据定义有缺失,少了所要查询证书的状态;也没有定义授权响应器与其撤销检查的方法;另外,没有定义存档截止时间,就无法提供对已过期后的证书撤销状态查询的功能。
二、协议分析
1.
OCSP与SOCSP的介绍
OCSP定义了客户端与响应器之间的通信标准。OCSP客户端发出一个证书状态查询请求给OCSP响应器,请求包含:协议版本、服务请求、目标证书标识和可选扩展项等,用户可以选择对请求进行签名,OCSP响应器确定请求的格式正确、响应器配置了所要求的服务并且请求包含响应器需要的信息后,返回给客户端一个明确的响应消息。该响应消息包括:版本号、响应器名称、对每一张被请求证书的回复、可选扩展项、签名算法对象标识符和签名值。响应器必须对明确的响应进行数字签名;如果请求不满足要求,就向OCSP客户端发出一个出错信息,出错信息不用进行数字签名。图1是一个简单的OCSP实现模式[5]。
图1 OCSP实现模式
SOCSP协议为电子政务和电子商务的安全认证系统提供简明、快捷的证书状态查询协议。它采用MAC密码算法来代替标准OCSP中的签名密码算法,同时简化了复杂的协议数据单元和扩展项。
SOCSP协议也是客户端和响应器之间的一个请求/响应协议。当用户需要查询一个或多个证书
的撤销状态时,SOCSP客户端产生一个SOCSP请求,包含一个或者多个待查询证书的标识符,然后发送给SOCSP响应器,并等待直到响应器返回一个响应。与OCSP协议不同的是,SOCSP协议的请求必须进行MAC计算而不是可选择的。
一个SOCSP请求包含:协议版本、服务请求、目标证书标识符等。SOCSP响应器对收到的请求返回一个响应(或是出错信息,或是明确的响应消息)。SOCSP响应器返回出错信息时不用进行MAC计算。SOCSP响应器返回明确的响应消息时,必须对该响应进行MAC计算,一个明确的响应消息包含:版本号、对请求中每个证书的响应、MAC算法的OID、响应的MAC值等。对每个证书的响应包含证书状态值:正常、撤销、未知。“正常”状态表示证书未被撤销;“撤销”状态表示证书已被撤销;“未知”状态表示响应器不能判断请求的证书状态。
2.SOCSP请求数据分析
SOCSP标准定义请求数据的ASN.1表示如下:
OCSPThinRequest ::= SEQUENCE { — 请求数据
tbsThinRequest TBSThinRequest, — 请求信息
mac MacData — 请求信息的MAC值
}
TBSThinRequest ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1, — 版本号
random BIT STRING, — 随机数
serialList SEQUENCE OF CertificateSerialNumber — 请求查询证书的序列号
}
MacData ::= SEQUENCE {
mac DigestInfo,
macSalt OCTET STRING,
iterations INTEGER DEFAULT 1 — 默认为1, HASH的反复次数
}
DigestInfo ::= SEQUENCE {
digestAlgorithm DigestAlgorithmIdentifier,
digest Digest
}
Digest ::= OCTET STRING
与OCSP不同,SOCSP的请求数据需要进行MAC计算而不是可选择的数字签名。为了提高系统的效率,SOCSP没有设置扩展,所以用来防止重放攻击的随机数以random字段出现在请求数据中,random的长度≥128比特。
MAC计算是基于TBSThinRequest的结构的DER编码,加上共享密钥与macSalt的模二加进行的,macSalt保证相同数据MAC的结果不相同。MAC算法由digestAlgorithm标识,支持符合国家规定的HMAC算法。
3.SOCSP响应数据分析
SOCSP标准定义响应数据的ASN.1表示如下:
OCSPThinResponse ::= SEQUENCE { — 响应数据
tbsThinResponse TBSThinResponse, — 响应信息
Mac MacData — 响应信息的MAC值
}
TBSThinResponse ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1, — 版本号
random BIT STRING, — 随机数
thinResponseStatus SEQUENCE OF OCSPThinResponseStatus — 响应状态
}
OCSPThinResponseStatus ::= ENUMERATED {
successful (0), --Response has valid confirmations — 响应被有效确认
malformedRequest (1), --Illegal confirmation request — 不完整的请求
internalError (2), --Internal error in issuer — 内部错误
unauthorized (3),--Request unauthorized — 未授权
}
从响应数据定义来看,响应包含了两个信息,响应信息和对响应信息进行MAC计算的值。响应数据包含:版本号、随机数、响应状态。随机数random与请求中的random相同;响应状态有四种:响应被有效确认、不完整的请求、内部错误、未授权。MacData数据定义与请求中一致。
整个响应数据字段缺少了所要查询的证书状态信息,也就是证书状态值:正常、撤销、未知的定义。类似于OCSP中的CertStatus字段:
CertStatus :: = CHOICE {
good [0] IMPLICIT NULL, — 未被撤销
revoked [1] IMPLICIT RevokedInfo, — 已被撤销
unknown [2] IMPLICIT UnknownInfo — 未知
}
三、协议改进
1.响应数据改进
根据SOCSP标准对响应内容的定义,当SOCSP响应器返回出错信息时不需要进行MAC计算,出错信息分别为:不完整的申请、内部错误、未授权;当SOCSP响应器返回明确的响应消息时,要对该响应进行MAC计算,明确的响应消息包含:版本号、对请求中每个证书的响应、MAC算法的OID、响应的MAC值,对SOCSP标准中响应数据定义修改为如下形式:
OCSPThinResponse ::= SEQUENCE { — 响应数据
thinResponseStatus OCSPThinResponseStatus, — 响应状态
responseContent [0] EXPLICIT ResponseContent OPTIONAL — 响应内容
}
OCSPThinResponseStatus ::= ENUMERATED {
successful (0), --Response has valid confirmations — 响应被有效确认
malformedRequest (1), --Illegal confirmation request — 不完整的请求
internalError (2), --Internal error in issuer — 内部错误
unauthorized (3), --Request unauthorized — 未授权
}
ResponseContent ::= SEQUENCE {
Response Response, — 响应信息
Mac MacData — 响应信息的MAC值
}
Response ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1, — 版本号
random BIT STRING, — 随机数
resultList SEQUENCE OF ResultList — 响应列表
}
ResultList ::= SEQUENCE {
Serial CertificateSerialNumber, — 证书序列号
certStatus CertStatus — 证书状态
}
CertStatus ::= CHOICE {
good [0] IMPLICIT NULL, — 未被撤销
revoked [1] IMPLICIT RevokedInfo, — 已被撤销
unknown [2] IMPLICIT UnknownInfo — 未知
}
2.授权响应器
在OCSP的标准和实际应用中,证书的签发者可以直接对OCSP响应签名或者指派授权给另一个实体对OCSP响应签名,只要保证响应源于可信任方并且在传输过程中未被改动即可。通常情况下,SOCSP的请求相对比较频繁,因此,SOCSP响应器的工作量较证书签发者CA来说是很大的,CA要负责签发证书,更新证书,证书撤销的检查等工作,如果还要对SOCSP响应进行MAC计算,负担太重,会对整个系统的效率有影响;SOCSP协议没有脱离客户端/服务器的查询模式,所以仍然存在着拒绝服务(DoS)攻击的潜在可能性,CA受到攻击的危害会更大。
如果采用授权响应器机制,用户应该得到OCSP响应器的公钥证书拷贝,该证书是由可信者(通常是CA)签发的,并且要对授权响应器的撤销检查进行说明。由于SOCSP协议为了提高通信数据的解析效率而去除了扩展项,所以授权响应器的撤销检查可以通过使用CRL来进行检查或者不指定任何方法来检查响应器证书的有效性,这根据具体应用的安全需要来确定。
3.增加响应计算的时间
OCSP协议支持证书过期后仍保留相应的撤销信息,可以提供对证书在过去某个时刻的撤销状态的确认,这对历史文档和以往交易的验证有着很重要的作用。提供该功能,就需要在OCSP响应中包含证书的存档截止时间,它通过OCSP响应数据ResponseData中的producedAt字段来实现。producedAt时间减去间隔保持值得到的时间就是证书的“存档截止”时间[6]。例如,如果服务器的操作具有采用5年保留期,那么间隔保持值就是5年,producedAt的值为t1,那么存档截止时间就是(t1-5年)。
建议SOCSP协议也增加响应进行MAC计算的时间producedAt字段,便于提供历史查询功能,并且对于重放攻击的检查也有一定作用,如果客户端接收到的响应消息中的producedAt时间与本地时间相差太大,就认为这个响应消息是重放攻击。
4.响应器的数据来源
OCSP协议比周期发布CRL具有更高的时效性,它能消除周期发布CRL机制因证书撤销状态信息滞后发布所带来的时延。但是,如果OCSP响应器的后端结构设计不好,很难发挥OCSP及时性的优势。在SOCSP标准中没有定义SOCSP响应器的后端结构,没有明确SOCSP响应器的信息采集数据源是来自CA的证书目录库还是CRL列表。如果用CRL来做SOCSP的后台数据库,SOCSP实时性的优势没有得到充分发挥;CA的证书目录库是CA系统不可缺少的一个组成部分,CA在撤销一个证书时,会及时更新证书目录库中该证书的状态,SOCSP协议可以用CA的证书目录库作为后台数据库,这样能保证用户能查询到最新的证书状态信息。
四、结束语
我国率先提出的用MAC算法来实现证书状态查询的SOCSP协议,不仅适合我国信息安全技术发展的水平,也为将来国家自主制定信息安全国家标准提供很好的经验指导。本文通过对SOCSP标准与OCSP标准对比研究,分析出SOCSP标准(报批稿)中存在的问题,并对SOCSP标准进行了改进和完善。下一步,我们将重点考虑设计与实现SOCSP系统,进而进一步分析和完善SOCSP标准。