OCSP协议分析

发布时间:2020/1/10 10:50:44 打印 字号:

协议概述

OCSP是一种相对简单的请求/响应协议,它使得客户端应用程序可以测定所需验证书的状态。一个OCSP客户端发送一个证书状态查询给一个OCSP响应器,并且等待直到响应器返回了一个响应。协议对OCSP客户端和OCSP响应器之间所需要交换的数据进行了描述。 一个OCSP请求包含以下数据:协议版本、服务请求、目标证书标识和可选的扩展项等。OCSP响应器对收到的请求返回一个响应(或是出错信息,或是确定的回复)。OCSP响应器返回出错信息时,该响应不用签名。出错信息包括以下类型:请求编码格式不正确、内部错误、稍后再试、请求需要签名、未授权。

OCSP响应器返回确定的回复时,该响应必须进行数字签名。一个确定的回复信息由以下组成:版本号、响应器名称、对每一张被请求证书的回复、可选扩展项、签名算法对象标识和签名值。在对每一张被请求证书的回复中包含有证书状态值:正常、撤消、未知。“正常”状态表示这张证书没有被撤消;“撤消”状态表示证书已被撤消;“未知”状态表示响应器不能判断请求的证书状态。

协议数据描述

请求消息描述:一个OCSP请求包括请求信息和对请求信息的签名,其形式化描述如下所示:

OCSPRequest::=SEQUENCE{

tbsRequestTBSRequest,

optionalSignature[0]EXPLICITSignatureOPTIONAL}

请求信息的签名是可选的。

如果响应器被设置为接收有签名的请求,而实际收到的请求没有签名时,响应器就返回一个“需要签名(sigRequired)”的出错信息。请求信息包括版本号、请求者名称(可选)、请求列表和可选的扩展项,如下所示:

TBSRequest::=SEQUENCE{

version[0]EXPLICITVersionDEFAULTv1,

requestorName[1]EXPLICITGeneralNameOPTIONAL,

requestListSEQUENCEOFRequest,

requestExtensions[2]EXPLICITExtensionsOPTIONAL}

Request::=SEQUENCE{

reqCertCertID,

singleRequestExtensions[0]EXPLICITExtensionsOPTIONAL}

一个OCSP请求可查询多个证书的状态。在每一个请求查询的证书标识中包含了Hash算法标识、证书颁发者(CA)名称Hash值、证书颁发者(CA)公钥Hash值和证书序列号。其形式化描述如下所示:

CertID::=SEQUENCE{

hashAlgorithmAlgorithmIdentifier,

issuerNameHashOCTETSTRING,

issuerKeyHashOCTETSTRING,

serialNumberCertificateSerialNumber}

响应消息描述:一个OCSP响应通常包括响应状态和响应字节。如果响应状态为某一种出错情况,那么响应字节将不被设置。其形式化描述如下所示:

OCSPResponse::=SEQUENCE{

responseStatusOCSPResponseStatus,

responseBytes[0]EXPLICIT ResponseBytesOPTIONAL}

响应状态有六种取值:一种是“成功”,表示响应器对接收到的请求返回一个确定的回复;另外五种为出错信息:请求编码格式不正确(malformedRequest)、内部错误(internalError)、稍后再试(trylater)、请求需要签名(sigRequired)、未授权 (unauthorized)。 如果接受到一个没有遵循OCSP语法规范的请求,响应器返回“请求编码格式不正确”;响应状态为“内部错误”表示 OCSP响应器处于一个不协调的内部状态,请求需要再试,暗示尝试另一个响应器;如果OCSP响应器正在工作,但是不能返回被请求证书的状态,那么“稍后再试”响应能被用来表示服务存在,但暂时不能响应;当服务器需要客户端签名请求后才能产生一个响应时,“请求需要签名”将被返回;当客户端未被授权允许向这台响应器发送请求时,“未授权”将被返回。 响应字节的值由响应类型标识和一个编码成OCTET字符串的响应信息(此信息由类型标识确定)组成。如下所示:

ResponseBytes::=SEQUENCE{

responseTypeOBJECTIDENTIFIER,

responseOCTETSTRING}

响应信息的值应该是基本OCSP响应 (BasicOCSPResponse)的DER编码。基本OCSP响应的形式化 描述如下所示:

BasicOCSPResponse::=SEQUENCE{

tbsResponseDataResponseData,

signatureAlgorithmAlgorithmIdentifier,

signatureBITSTRING,

certs[0]EXPLICITSEQUENCEOFCertificateOPTIONAL}

签名值(signature)是对响应数据(ResponseData)的签名结果。响应数据包括版本号、响应器标识、响应产生时间、响应列表和可选的扩展项。其形式化描述如下所示:

ResponseData::=SEQUENCE{

version[0]EXPLICITVersionDEFAULTv1,

responderIDResponderID,

producedAtGeneralizedTime,

responsesSEQUENCEOF SingleResponse,

responseExtensions[1] EXPLICITExtensions OPTIONAL}

如果一个OCSP请求中包含多个证书的查询请求,那么响应列表(responses)就列出了请求中所有证书状态的响应。每个证书状态响应(SingleResponse)包含证书标识、证书状态、本次更新时间、下次更新时间(可选)和扩展项,如下所示:

SingleResponse::=SEQUENCE{

certIDCertID,

certStatusCertStatus,

thisUpdateGeneralizedTime,

nextUpdate[0]EXPLICITGeneralizedTimeOPTIONAL,

singleExtensions[1]EXPLICITExtensionsOPTIONAL}

证书状态分为三种:正常(good)、撤消(revoked)、未知 (unknown)。

CertStatus::=CHOICE{

good[0]IMPLICITNULL,

revoked[1]IMPLICITRevokedInfo,

unknown[2]IMPLICITUnknownInfo}