0

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

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

我认为查看实际签名/证书/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 -extension:

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 响应的另一个版本进行了比较,并在Adob​​e Reader 中遇到的 Prolems中得到了这个错误:

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 签名无效?或者我可以以某种方式包含证书链的缺失部分以使其验证吗?或者这可能不是问题?

4

1 回答 1

1

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='
         :                                         }
         :                                       }
         :                                     }

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

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

但是 RFC 6960为 nonce 扩展指定了 RFC 2560 中缺少的 ASN.1 语法......

Nonce ::= OCTET STRING

(RFC 6960 第 1 节和第 4.4.1 节)

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

因此,请尝试将您为nonce选择的值包装在一个 OCTET STREAM 中(然后,根据Extension定义,它将被包装在另一个 OCTET STREAM 中)。

所有证书的吊销信息

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

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

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

OCSP 服务 TLS 证书

因为您的签名并未带来所有必需的撤销信息。Adobe Reader 尝试在线接收它们。这样做时,它会遇到错误。

我得到的详细错误信息是

证书对用途无效______________________________________________

证书对用途无效______________________________________________

SSL 证书错误。

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

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

于 2017-06-19T22:19:17.757 回答