无法在 Adobe Reader 中验证嵌入式 OCSP



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

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

我认为查看实际的签名/证书/OCSP 比查看我的代码更容易。签名的 PDF 可在此处获得:

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

Base64 编码的签名在这里:

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

编辑:

当我在Adobe 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=

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

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

编辑3:

我将该文件与没有嵌入式OCSP响应的另一个版本进行了比较,并在Adobe 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 签名无效?或者我可以以某种方式包含证书链的缺失部分以使其验证吗?或者这也许不是问题所在?

OCSP Nonce 编码

OCSP 响应中的随机数扩展按如下方式编码:

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

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

但请记住,根据定义,扩展的值包装在八位字节字符串中。因此,你的实际随机数值是由字符EZrf5DVM/y1QFGUfydwBSOsxZ6s=的ASCII值给出的字节序列,即就ASN.1而言完全非类型化的东西。

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

Nonce ::= OCTET STRING

(RFC 6960 第 1 节和第 4.4.1 节)

因此,就 ASN.1 而言,您的随机数值必须是八位字节字符串而不是非类型化。

因此,请尝试将您为随机数选择的值包装在八位字节流中(然后,根据Extension定义,该值将包装在另一个八位字节流中)。

所有证书的吊销信息

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

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

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

OCSP 服务 TLS 证书

由于您的签名不会带来所有必需的吊销信息。Adobe Reader 會嘗試在線接收它們。这样做时,它会遇到错误。

我得到的详细错误信息是

证书对usage____________________________________________________________无效

证书对usage____________________________________________________________无效

SSL 证书错误。

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

您似乎收到不同的错误。您是否在计算机或 Adobe Reader 中安装并信任了一些特殊证书?

最新更新