Xades4J验证签名时出错:属性'SigningCertificate'验证失败:属性包含太多证书

时间:2012-09-18 12:28:45

标签: xades4j

当我验证我在使用相同的密钥库(和XA)之前创建的签名时,会出现以下异常:

  

属性“SigningCertificate”的验证失败:SigningCertificate属性包含一个或多个不属于证书路径的证书。

我正在使用以下证书链:

  1. root-CA(globalsign),
  2. 中间证书
  3. 公司证书
  4. 项目证书
  5. 所有证书都存储在使用过的密钥库中。

    但是,当使用自签名证书尝试相同的操作时,只有它可以工作,我只需要将证书放在certs-and-crls目录中。

    KeyingDataProvider:

    new FileSystemKeyStoreKeyingDataProvider(KeyStore.getDefaultType(),
        "D:\...\signing.keystore", 
        new FirstCertificateSelector(),
        new DirectStorePasswordProvider("pass"),
        new DirectKeyPasswordProvider("pass"), true);
    

    CertificateValidationProvider:

    FileSystemDirectoryCertStore certStore = new FileSystemDirectoryCertStore("D:\...\certs");
    CertificateValidationProvider certValidator = new PKIXCertificateValidationProvider(
            loadKeystore(), 
            false, // should be true, when validation works.
            certStore.getStore());
    
    private KeyStore loadKeystore() {
        // deleted exception handling for readability, here
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        FileInputStream keystoreInStream = new FileInputStream("D:\...\verification.keystore");
        keyStore.load(keystoreInStream, "pass".toCharArray());
        return keyStore;
    }
    

    对密钥库的反馈

    signed-keystore包含所有4个证书。 verify-keystore仅包含根证书(globalsign-root-ca)。 certs-directory包含除root(globalsign-root-ca)之外的所有证书。然后我收到以下错误:

      

    引起:sun.security.provider.certpath.SunCertPathBuilderException:   无法找到所请求目标的有效证书路径

    当使用与签名相同的密钥库(文件系统副本)时,我收到错误:

      

    引起:   xades4j.verification.SigningCertificateCertsNotInCertPathException:   属性'SigningCertificate'的验证失败:   SigningCertificate属性包含一个或多个证书   不属于认证途径。

1 个答案:

答案 0 :(得分:0)

我终于明白了(即一位同事帮助我)。 我以前用自己创建的密钥对(#4)签名的证书/密钥(#3)不允许签署其他证书。尽管可以在没有任何错误的情况下创建签名,但在验证签名时收到错误消息unable to find valid certification path to requested target,这是非常误导的。

作为“解决方案”,我只使用证书#1-3,并使用#3的私钥创建签名。

@lgoncalves感谢您的持久帮助。

PS:当我配置启用CRL时,我得到了与我的工作设置相同的错误消息,但是没有提供所有这些消息(即,当验证生成的签名时,#1发出的一个CRL和#1发出的一个CRL #3)。