无法获取嵌入式 OCSP 以在 Adobe 中进行验证 Reader
Can't get embedded OCSP to validate in Adobe Reader
我正在使用 Bouncy Castle 签署 PDF 并在 PKCS7 中嵌入 OCSP 响应。我 assemble 使用 PDFBox 签名的 PDF,但我终生无法让生成的文件在 Adobe Reader 中正确验证(OCSP 无法识别)。由于 OCSP 响应程序需要签名请求,因此我必须将响应嵌入到文件中。
如果有人有任何指点,将不胜感激。
我想查看实际的 signature/certs/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 响应的另一个版本进行了比较,并在 遇到的问题 in Adobe 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)时,我也被告知证书问题。
您似乎遇到了不同的错误。您是否在计算机或 Adobe Reader 中安装并信任某些特殊证书?
我正在使用 Bouncy Castle 签署 PDF 并在 PKCS7 中嵌入 OCSP 响应。我 assemble 使用 PDFBox 签名的 PDF,但我终生无法让生成的文件在 Adobe Reader 中正确验证(OCSP 无法识别)。由于 OCSP 响应程序需要签名请求,因此我必须将响应嵌入到文件中。
如果有人有任何指点,将不胜感激。
我想查看实际的 signature/certs/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 响应的另一个版本进行了比较,并在 遇到的问题 in Adobe 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)时,我也被告知证书问题。
您似乎遇到了不同的错误。您是否在计算机或 Adobe Reader 中安装并信任某些特殊证书?