我正在与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 中安装并信任了一些特殊证书?