在PDF签名中嵌入OCSP证书状态:当OCSP responderCert!= issuerCert时无效

时间:2014-11-26 10:59:16

标签: pdf itext ocsp

为了签署PDF,我使用signDetached。

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

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

  • OCSP服务器正常运行,但
  • CA使用符号OCSP响应与受信任的responderCert(不同于issuerCert)。

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


此外

当我尝试通过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

此处提供了根证书和中间证书:

1 个答案:

答案 0 :(得分: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,使responderCert信任)?

没有必要强迫,iText确实嵌入了检索到的OCSP响应而无需进一步检查(快速代码审查支持此功能)。

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

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

  
    

依赖OCSP响应的系统或应用程序......必须拒绝        如果证书需要验证签名的响应        响应无法满足以下至少一个标准:

         
        
  1. 匹配的OCSP签名权限的本地配置     有问题的证书;或

  2.     
  3. 是否颁发证书的CA的证书     题;或

  4.     
  5. 在ExtendedKeyUsage中包含id-ad-ocspSigning的值     扩展并由颁发证书的CA颁发     。问题&#34;

  6.        

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

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

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

      
        

    注意:为了向后兼容RFC 2560 [RFC2560],它不是              禁止为授权响应者颁发证书              使用与用于发布的密钥不同的发布密钥              正在检查撤销证书。但是,这样的              由于客户不是,所以强烈建议不要这样做              需要识别具有此类证书的响应者              授权响应者。

      

    所以现在瑞士政府CA使用的证书结构明显是强烈劝阻(这实际上意味着如果能够/允许,IETF会禁止它。)