跳到主要内容

4. 协议细节

4. 协议细节

ASN.1 语法导入 [RFC5280] 中定义的术语.对于签名计算, 待签名数据使用 ASN.1 可分辨编码规则 (Distinguished Encoding Rules, DER) [X.690] 进行编码.

除非另有规定, ASN.1 默认使用 EXPLICIT 标记.

从其他位置导入的术语包括 Extensions, CertificateSerialNumber, SubjectPublicKeyInfo, Name, AlgorithmIdentifier 和 CRLReason.

4.1. 请求语法

本节规定确认请求的 ASN.1 规范.消息的实际格式可能因使用的传输机制 (HTTP, SMTP, LDAP 等) 而异.

4.1.1. OCSP 请求的 ASN.1 规范

与 OCSPRequest 对应的 ASN.1 结构为:

OCSPRequest     ::=     SEQUENCE {
tbsRequest TBSRequest,
optionalSignature [0] EXPLICIT Signature OPTIONAL }

TBSRequest ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
requestorName [1] EXPLICIT GeneralName OPTIONAL,
requestList SEQUENCE OF Request,
requestExtensions [2] EXPLICIT Extensions OPTIONAL }

Signature ::= SEQUENCE {
signatureAlgorithm AlgorithmIdentifier,
signature BIT STRING,
certs [0] EXPLICIT SEQUENCE OF Certificate
OPTIONAL}

Version ::= INTEGER { v1(0) }

Request ::= SEQUENCE {
reqCert CertID,
singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL }

CertID ::= SEQUENCE {
hashAlgorithm AlgorithmIdentifier,
issuerNameHash OCTET STRING, -- Hash of issuer's DN
issuerKeyHash OCTET STRING, -- Hash of issuer's public key
serialNumber CertificateSerialNumber }

OCSPRequest 中各字段的含义如下:

  • tbsRequest 是可选签名的 OCSP 请求.

  • optionalSignature 在 signatureAlgorithm 中包含算法标识符和任何关联算法参数, 在 signature 中包含签名值, 并可选地包含服务器验证签名响应所需的证书 (通常到客户端根证书之前, 不包括客户端根证书).

TBSRequest 的内容包括以下字段:

  • version 指示协议版本, 对本文档而言为 v1(0).

  • requestorName 为 OPTIONAL, 指示 OCSP 请求方名称.

  • requestList 包含一个或多个单证书状态请求.

  • requestExtensions 为 OPTIONAL, 包含适用于 reqCert 中请求的扩展. 见第 4.4 节.

Request 的内容包括以下字段:

  • reqCert 包含目标证书的标识符.

  • singleRequestExtensions 为 OPTIONAL, 包含适用于此单个证书状态请求的扩展. 见第 4.4 节.

CertID 的内容包括以下字段:

  • hashAlgorithm 是用于生成 issuerNameHash 和 issuerKeyHash 值的哈希算法.

  • issuerNameHash 是签发者可分辨名称 (Distinguished Name, DN) 的哈希.该哈希应基于正在检查证书中签发者 name 字段的 DER 编码计算.

  • issuerKeyHash 是签发者公钥的哈希.该哈希应基于签发者证书中 subject public key 字段的值 (不包括标记和长度) 计算.

  • serialNumber 是正在请求状态的证书序列号.

4.1.2. 关于 OCSP 请求的说明

除了 CA 名称的哈希之外还使用 CA 公钥的哈希来标识签发者, 主要原因是两个 CA 可能选择使用相同的 Name (Name 的唯一性是一项无法强制执行的建议).然而, 除非两个 CA 明确决定共享私钥, 或其中一个 CA 的密钥已泄露, 否则两个 CA 不会拥有相同的公钥.

对任何特定扩展的支持都是 OPTIONAL.critical 标志 SHOULD NOT 为其中任何扩展设置.第 4.4 节建议了若干有用扩展.其他 RFC MAY 定义附加扩展.未识别的扩展 MUST 被忽略 (除非它们设置了 critical 标志且无法理解).

请求方 MAY 选择对 OCSP 请求进行签名.在这种情况下, 签名基于 tbsRequest 结构计算.如果请求已签名, 请求方 SHALL 在 requestorName 字段中指定其名称.此外, 对于签名请求, 请求方 MAY 在 Signature 的 certs 字段中包含有助于 OCSP 响应方验证请求方签名的证书.

4.2. 响应语法

本节规定确认响应的 ASN.1 规范.消息的实际格式可能因使用的传输机制 (HTTP, SMTP, LDAP 等) 而异.

4.2.1. OCSP 响应的 ASN.1 规范

OCSP 响应至少由 responseStatus 字段组成, 该字段指示先前请求的处理状态.如果 responseStatus 的值为某个错误条件, 则不设置 responseBytes 字段.

OCSPResponse ::= SEQUENCE {
responseStatus OCSPResponseStatus,
responseBytes [0] EXPLICIT ResponseBytes OPTIONAL }

OCSPResponseStatus ::= ENUMERATED {
successful (0), -- Response has valid confirmations
malformedRequest (1), -- Illegal confirmation request
internalError (2), -- Internal error in issuer
tryLater (3), -- Try again later
-- (4) is not used
sigRequired (5), -- Must sign the request
unauthorized (6) -- Request unauthorized
}

responseBytes 的值由 OBJECT IDENTIFIER 和由该 OID 标识,并编码为 OCTET STRING 的响应语法组成.

ResponseBytes ::=       SEQUENCE {
responseType OBJECT IDENTIFIER,
response OCTET STRING }

对于基本 OCSP 响应方, responseType 将为 id-pkix-ocsp-basic.

id-pkix-ocsp           OBJECT IDENTIFIER ::= { id-ad-ocsp }
id-pkix-ocsp-basic OBJECT IDENTIFIER ::= { id-pkix-ocsp 1 }

OCSP 响应方 SHALL 能够生成 id-pkix-ocsp-basic 响应类型的响应.相应地, OCSP 客户端 SHALL 能够接收并处理 id-pkix-ocsp-basic 响应类型的响应.

response 的值 SHALL 为 BasicOCSPResponse 的 DER 编码.

BasicOCSPResponse       ::= SEQUENCE {
tbsResponseData ResponseData,
signatureAlgorithm AlgorithmIdentifier,
signature BIT STRING,
certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }

signature 的值 SHALL 基于 ResponseData 的 DER 编码哈希计算.响应方 MAY 在 BasicOCSPResponse 的 certs 字段中包含有助于 OCSP 客户端验证响应方签名的证书.如果未包含证书, 则 certs SHOULD 不出现.

ResponseData ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
responderID ResponderID,
producedAt GeneralizedTime,
responses SEQUENCE OF SingleResponse,
responseExtensions [1] EXPLICIT Extensions OPTIONAL }

ResponderID ::= CHOICE {
byName [1] Name,
byKey [2] KeyHash }

KeyHash ::= OCTET STRING -- SHA-1 hash of responder's public key
(excluding the tag and length fields)

SingleResponse ::= SEQUENCE {
certID CertID,
certStatus CertStatus,
thisUpdate GeneralizedTime,
nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL,
singleExtensions [1] EXPLICIT Extensions OPTIONAL }

CertStatus ::= CHOICE {
good [0] IMPLICIT NULL,
revoked [1] IMPLICIT RevokedInfo,
unknown [2] IMPLICIT UnknownInfo }

RevokedInfo ::= SEQUENCE {
revocationTime GeneralizedTime,
revocationReason [0] EXPLICIT CRLReason OPTIONAL }

UnknownInfo ::= NULL

4.2.2. 关于 OCSP 响应的说明

4.2.2.1. 时间

响应可以包含四个时间: thisUpdate, nextUpdate, producedAt 和 revocationTime.这些字段的语义定义于第 2.4 节.GeneralizedTime 的格式按 [RFC5280] 第 4.1.2.5.2 节规定.

thisUpdate 和 nextUpdate 字段定义一个推荐有效性区间.该区间对应于 CRL 中的 {thisUpdate, nextUpdate} 区间.nextUpdate 值早于本地系统时间值的响应 SHOULD 被视为不可靠.thisUpdate 时间晚于本地系统时间的响应 SHOULD 被视为不可靠.

如果未设置 nextUpdate, 响应方表示更新的撤销信息始终可用.

4.2.2.2. 授权响应方

签署证书状态信息的密钥不必与签署该证书的密钥相同.然而, 必须确保签署此信息的实体被授权这样做.因此, 证书签发者 MUST 执行以下操作之一:

  • 自行签署 OCSP 响应, 或

  • 将此权限显式指定给另一个实体

OCSP 签名委托 SHALL 通过在 OCSP 响应签名者证书所包含的扩展密钥用法证书扩展中包含 id-kp-OCSPSigning 来指定.该证书 MUST 由请求中标识的 CA 直接签发.

CA SHOULD 使用与签署正在检查撤销状态的证书相同的签发密钥来签发委托证书.依赖 OCSP 响应的系统只有在委托证书和正在检查撤销状态的证书由同一密钥签署时, 才 MUST 将委托证书识别为由签发所涉证书的 CA 签发.

注意: 为了与 RFC 2560 [RFC2560] 向后兼容, 并不禁止使用不同于签发正在检查撤销状态证书的签发密钥来为授权响应方签发证书.但是, 强烈不建议这种做法, 因为客户端无需将持有此类证书的响应方识别为授权响应方.

id-kp-OCSPSigning OBJECT IDENTIFIER ::= {id-kp 9}

依赖 OCSP 响应的系统或应用 MUST 能够按上述方式检测并强制使用 id-kp-OCSPSigning 值.它们 MAY 提供一种本地配置一个或多个 OCSP 签名机构并指定每个签名机构受信任 CA 集合的方式.如果验证响应签名所需的证书不满足以下至少一项准则, 它们 MUST 拒绝该响应:

  1. 与所涉证书的 OCSP 签名机构本地配置匹配, 或

  2. 是签发所涉证书的 CA 的证书, 或

  3. 在扩展密钥用法扩展中包含 id-kp-OCSPSigning 值, 并且如上所述由签发所涉证书的 CA 签发.

其他接受或拒绝准则可以适用于响应本身, 或适用于用来验证响应签名的证书.

4.2.2.2.1. 授权响应方的撤销检查

由于授权 OCSP 响应方为一个或多个 CA 提供状态信息, OCSP 客户端需要知道如何检查授权响应方的证书未被撤销.CA 可以选择以下三种方式之一处理此问题:

  • CA 可以指定 OCSP 客户端可在响应方证书生命周期内信任该响应方.CA 通过包含 id-pkix-ocsp-nocheck 扩展来实现这一点.该扩展 SHOULD 为非关键扩展.扩展值 SHALL 为 NULL.签发此类证书的 CA 应意识到, 至少在该证书有效期内, 响应方密钥泄露与用于签署 CRL 的 CA 密钥泄露同样严重.CA 可以选择签发生命周期很短的此类证书并频繁续期.
id-pkix-ocsp-nocheck OBJECT IDENTIFIER ::= { id-pkix-ocsp 5 }
  • CA 可以指定如何对响应方证书进行撤销检查.如果检查应使用 CRL, 可通过 CRL Distribution Points 完成; 如果检查应以其他方式完成, 可通过 Authority Information Access 完成.指定这两种机制中任一种的详细信息见 [RFC5280].

  • CA 可以选择不为响应方证书指定任何撤销检查方法, 在这种情况下, 是否应检查该证书的撤销状态由 OCSP 客户端的本地安全策略决定.

4.2.2.3. 基本响应

基本响应类型包含:

  • 响应语法版本, 对此版本的基本响应语法而言 MUST 为 v1 (值为 0);

  • 作为 ResponderID 的响应方名称或响应方公钥哈希;

  • 响应生成时间;

  • 对请求中每个证书的响应;

  • 可选扩展;

  • 基于响应哈希计算的签名; 以及

  • 签名算法 OID.

ResponderID 信息的目的是允许客户端找到用于签署已签名 OCSP 响应的证书.因此, 该信息 MUST 对应于用于签署该响应的证书.

响应方 MAY 在 BasicOCSPResponse 的 certs 字段中包含有助于 OCSP 客户端验证响应方签名的证书.

对请求中每个证书的响应由以下内容组成:

  • 正在为其提供撤销状态信息的证书标识符 (即目标证书);

  • 证书的撤销状态 (good, revoked 或 unknown); 如果已撤销, 则指示证书被撤销的时间, 并可选地指示撤销原因;

  • 响应的有效性区间; 以及

  • 可选扩展.

响应 MUST 为请求中的每个证书包含一个 SingleResponse.响应 SHOULD NOT 包含任何附加 SingleResponse 元素; 但是, 例如, 预生成状态响应的 OCSP 响应方在必要时可能会包含附加 SingleResponse 元素, 以提高响应预生成性能或缓存效率 (按照 [RFC5019] 第 2.2.1 节).

4.3. 强制和可选加密算法

请求 OCSP 服务的客户端 SHALL 能够处理使用 RSA with SHA-256 签名的响应 (由 [RFC4055] 中规定的 sha256WithRSAEncryption OID 标识).客户端 SHOULD 也能够处理使用 RSA with SHA-1 签名的响应 (由 [RFC3279] 中规定的 sha1WithRSAEncryption OID 标识) 以及使用 SHA-1 的数字签名算法 (Digital Signature Algorithm, DSA) 签名的响应 (由 [RFC3279] 中规定的 id-dsa-with-sha1 OID 标识).客户端 MAY 支持其他算法.