无法获取嵌入式 OCSP 以在 Adob​​e 中进行验证 Reader

Can't get embedded OCSP to validate in Adobe Reader

我正在使用 Bouncy Castle 签署 PDF 并在 PKCS7 中嵌入 OCSP 响应。我 assemble 使用 PDFBox 签名的 PDF,但我终生无法让生成的文件在 Adob​​e Reader 中正确验证(OCSP 无法识别)。由于 OCSP 响应程序需要签名请求,因此我必须将响应嵌入到文件中。

如果有人有任何指点,将不胜感激。

我想查看实际的 signature/certs/OCSP 比查看我的代码更容易。已签名的 PDF 可在此处获得:

https://drive.google.com/open?id=0B_TaSaQW0YXteUgtbUlEa0NhcGc

Base64 编码的签名在这里:

https://drive.google.com/open?id=0B_TaSaQW0YXtaEtPczRROTg4UDA

编辑:

当我在 Adob​​e Reader 中查看证书并检查吊销 > 遇到的问题时,它说:

Certificate is not valid for the usage. Must sign the request.

吊销部分还说:

An attempt was made to determine whether the certificate is valid by doing 
a revocation check using the Online Certificate Status Protocol (OCSP).

所以好像完全跳过了嵌入式 OCSP。

编辑 2:

根据 mkl 的建议,我通过更改以下行更新了 nonce-扩展:

DEROctetString extValue = new DEROctetString(nonce);

为此:

DEROctetString extValue = new DEROctetString(new DEROctetString(nonce)));

导致以下 DER 结构:

[1] (1 elem)
  SEQUENCE (1 elem)
    SEQUENCE (2 elem)
      OBJECT IDENTIFIER 1.3.6.1.5.5.7.48.1.2ocspNonce(OCSP)
      OCTET STRING (1 elem)
        OCTET STRING IKhVULz41m7JWTa4swZXJPBm6Zs=

但我在 Adob​​e Reader 中仍然收到相同的错误消息。我已附上更新后的文档和 base64 编码的签名:

https://drive.google.com/open?id=0B_TaSaQW0YXtVjNqRWlxbXg4T0U https://drive.google.com/open?id=0B_TaSaQW0YXtNC1CblZlUHV4dGs

编辑 3:

我将文件与没有嵌入 OCSP 响应的另一个版本进行了比较,并在 遇到的问题 in Adob​​e Reader:

中遇到了这个错误
Must sign the request.

让我相信初始错误的第一部分确实来自于尝试验证嵌入式 OCSP 响应:

Certificate is not valid for the usage. 

我想有问题的证书应该是 OCSP 响应的签名证书。我自己的文档使用以下证书结构签名:

Root CA -> Bank (on EU Trust List) -> My Company

OCSP 使用以下结构签名:

Root CA -> External company (cert marked for OCSP signing)

文档签名链中的中间证书是否使 OCSP 签名无效?或者我可以以某种方式包含证书链的缺失部分以使其有效吗?或者这也许不是问题所在?

OCSP Nonce 编码

您的 OCSP 响应中的 nonce 扩展编码如下:

3405   45:                                   [1] {
3407   43:                                     SEQUENCE {
3409   41:                                       SEQUENCE {
3411    9:                                         OBJECT IDENTIFIER
         :                                           ocspNonce (1 3 6 1 5 5 7 48 1 2)
3422   28:                                         OCTET STRING 'EZrf5DVM/y1QFGUfydwBSOsxZ6s='
         :                                         }
         :                                       }
         :                                     }

这很可能对应于您在请求中发送的 nonce 扩展。

不过请记住,根据定义,扩展值包含在 OCTET STRING 中。因此,您的实际 nonce 值是由字符 EZrf5DVM/y1QFGUfydwBSOsxZ6s= 的 ASCII 值给出的字节序列,即就 ASN.1 而言完全没有类型的东西。

但 RFC 6960 指定了 RFC 2560 中缺失的 ASN.1 语法作为随机数扩展...

Nonce ::= OCTET STRING

(RFC 6960 第 1 节和第 4.4.1 节)

因此,就 ASN.1 而言,您的 nonce 值必须是 OCTET STRING 而不是无类型。

因此,请尝试将您为 nonce 选择的值包装在 OCTET STREAM 中(然后,根据 Extension 定义,将包装在又一个八位字节流)。

所有证书的吊销信息

为了在没有额外的撤销信息请求的情况下使验证成功,签名必须携带所有涉及的证书的撤销信息,除了(受信任的)根证书和其他相应标记的证书。

因此,您不仅需要签名者证书和中介银行证书的吊销信息,还需要嵌入式 OCSP 响应的 OCSP 证书的吊销信息(除非它们具有 id-pkix-ocsp-nocheck 扩展名)。

如果我正确阅读了 ASN.1 转储,则您所用的 OCSP 证书没有该扩展名。因此,Adobe Reader 将尝试在线接收吊销信息,如果不起作用,它不会使用您的嵌入式 OCSP 响应。

OCSP 服务 TLS 证书

因为您的签名没有提供所有必需的撤销信息。 Adobe Reader 尝试在线接收它们。这样做时,它会出错。

我得到的详细错误信息是

Certificate is not valid for the usage____________________________________________________________

Certificate is not valid for the usage____________________________________________________________

SSL certificate error.

事实上,尝试手动访问 https://va1.bankid.no/(OCSP 服务器的 URL)时,我也被告知证书问题。

您似乎遇到了不同的错误。您是否在计算机或 Adob​​e Reader 中安装并信任某些特殊证书?