0

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

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

我正在使用以下证书链:

  1. 根 CA (globalsign),
  2. 中级证书
  3. 公司证书
  4. 项目证书

所有证书都存储在使用的密钥库中。

但是,当使用自签名证书尝试相同的事情时,只有它有效,我只需要将证书也放入 certs-and-crls-directory 中。

键控数据提供者:

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

证书验证提供者:

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;
}

对密钥库的反馈

签名密钥库包含所有 4 个证书。验证密钥库仅包含根证书 (globalsign-root-ca)。certs 目录包含除根 (globalsign-root-ca) 之外的所有证书。然后我收到以下错误:

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

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

原因:xades4j.verification.SigningCertificateCertsNotInCertPathException:属性“SigningCertificate”的验证失败:SigningCertificate 属性包含一个或多个不属于证书路径的证书。

4

1 回答 1

0

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

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

@lgoncalves 感谢您的持久帮助。

PS:当我配置 CRL 启用但不提供所有 CRL 时,我在工作设置中收到相同的错误消息(即,在验证使用 #3 生成的签名时,一个 CRL 由 #2 发出,一个 CRL 由 #1 发出) .

于 2012-10-08T08:33:01.357 回答