0

为了签署 PDF,我使用了 signDetached。

... 
OcspClient ocspClient = new OcspClientBouncyCastle();
MakeSignature.signDetached(appearance, digest, pks, chain, crlList, ocspClient, tsaClient, estimatedSize, subfilter);

PDF 签名没有错误,但缺少嵌入式 OCSP 响应:

  • OCSP 服务器正常工作,但
  • 我正在使用的 CA 使用受信任的 responderCert(与 issuerCert 不同)签署 OCSP 响应。

我如何在不验证 OCSP 响应的情况下强制 signDetached 嵌入 OCSP 状态(或传递给 signDetached responseerCert 以信任)?


而且

当我尝试通过 com.itextpdf.text.pdf.security.OCSPVerifier 验证 OCSP 状态时,我收到错误消息:

Java::JavaSecurity::SignatureException: certificate does not verify with supplied key 

在这种情况下,我们使用瑞士政府 CA:

Swiss Government Root CA I
`- Swiss Government Enhanced CA 01 < issuer certificate 
   `- Mor... < signature certificate

OCSP 响应由以下人员签名:

Swiss Government Root CA II
`- Swiss Government SSL CA 01 
   `- Swiss Government OCSP < OCSP responderCert

根证书和中间证书可在此处获得:

4

1 回答 1

1

...但是缺少嵌入式 OCSP 响应...

检查示例 PDF 可以清楚地看到嵌入了 OCSP 响应

 6469  3174:             SEQUENCE {
 6473     9:               OBJECT IDENTIFIER '1 2 840 113583 1 1 8'
 6484  3159:               SET {
 6488  3155:                 SEQUENCE {
 6492   791:                   [0] {
 6496   787:                     SEQUENCE {
 6500   783:                       SEQUENCE {
 .... CRL for CA certificate ....
           :                         }
           :                       }
           :                     }
 7287  2356:                   [1] {
 7291  2352:                     SEQUENCE {
 7295  2348:                       SEQUENCE {
 7299     1:                         ENUMERATED 0
 7302  2341:                         [0] {
 7306  2337:                           SEQUENCE {
 7310     9:                             OBJECT IDENTIFIER
           :                               ocspBasic (1 3 6 1 5 5 7 48 1 1)
 7321  2322:                             OCTET STRING, encapsulates {
 7325  2318:                               SEQUENCE {
 7329   270:                                 SEQUENCE {
 7333    97:                                   [1] {
 7335    95:                                     SEQUENCE {
 7337    11:                                       SET {
 7339     9:                                         SEQUENCE {
 7341     3:                                           OBJECT IDENTIFIER
           :                                             countryName (2 5 4 6)
 7346     2:                                           PrintableString 'CH'
           :                                           }
           :                                         }
 7350    29:                                       SET {
 7352    27:                                         SEQUENCE {
 7354     3:                                           OBJECT IDENTIFIER
           :                                             organizationName (2 5 4 10)
 7359    20:                                           UTF8String 'Swiss Government PKI'
           :                                           }
           :                                         }
 7381    17:                                       SET {
 7383    15:                                         SEQUENCE {
 7385     3:                                           OBJECT IDENTIFIER
           :                                             organizationalUnitName (2 5 4 11)
 7390     8:                                           UTF8String 'Services'
           :                                           }
           :                                         }
 7400    30:                                       SET {
 7402    28:                                         SEQUENCE {
 7404     3:                                           OBJECT IDENTIFIER
           :                                             commonName (2 5 4 3)
 7409    21:                                           UTF8String 'Swiss Government OCSP'
           :                                           }
           :                                         }
           :                                       }
           :                                     }
 .... remainder of OCSP response for signer certificate
           :                         }
           :                       }
           :                     }

因此回答这个问题:

如何在不验证 OCSP 响应的情况下强制 signDetached 嵌入 OCSP 状态(或传递给 signDetached 响应者证书以信任)?

无需强制,iText 确实嵌入了检索到的 OCSP 响应而无需进一步检查(快速代码审查支持这一点)。

但是,瑞士政府 CA 及其证书结构遇到麻烦仍然不足为奇。

根据 RFC 2560(从 PDF 规范 ISO 32000-1 中明确引用,因此,尽管它已被 RFC 6960 废弃,但必须在此处使用):

依赖 OCSP 响应的系统或应用程序......如果验证响应上的签名所需的证书不能满足以下至少一项标准,则必须拒绝响应:

  1. 匹配相关证书的 OCSP 签名机构的本地配置;或者

  2. 是颁发相关证书的 CA 的证书;或者

  3. 在 ExtendedKeyUsage 扩展中包含 id-ad-ocspSigning 的值,由颁发相关证书的 CA 颁发。”

对于瑞士政府 CA 签名,这意味着:

  1. 在通用环境中,您通常没有针对瑞士政府签名的特定本地配置。
  2. OCSP 响应者证书不是颁发签名者证书的证书。
  3. 虽然存在 EKU 值,但没有通用方法来验证 OCSP 证书和签署者证书是否由同一 CA 颁发,因为它们的证书链不相关。

因此,通常必须拒绝那些 OCSP 响应。

如果您还查看较新的 RFC 6960,您会看到:

注意:为了与 RFC 2560 [RFC2560] 向后兼容,不禁止使用与用于颁发被检查吊销证书的密钥不同的颁发密钥为授权响应者颁发证书。但是,强烈不鼓励这种做法,因为客户端不需要将具有此类证书的响应者识别为授权响应者。

因此,如今瑞士政府 CA 使用的证书结构甚至被强烈反对(这实质上意味着 IETF 如果能够/允许这样做,就会禁止它)。

于 2014-11-26T15:27:55.570 回答