java - 根据 Java 中的自定义信任列表检查证书有效性

标签 java security x509certificate

我有一份使用 CAdES 进行数字签名的文档。我使用 BouncyCaSTLe API 获取签名者的 X509Certificate[] 实例,但我们假设该列表仅包含一个元素。

我需要在今天验证此证书是否受信任,并且我不想使用通常用于信任 SSL 证书的系统标准信任库。不,我想在我的类路径中使用 .cer 文件列表构建我自己的信任列表。目前,单个 CA 是受信任的,但显然将来可能会添加更多证书。

到目前为止,我已经阅读了 this 并尝试在我的代码中实现。我不需要 SSLContext,我需要检查数字签名文档的有效性。我现在很困惑。

X509TrustManager 然而,API 仅提供验证客户端/服务器证书的方法,而我的 API 仅具有数字签名/不可否认性使用标志。

问题可以用两种方式来表达:

  1. Java 中如何根据可加载到内存中的自定义根 CA 列表检查 X509Certificate 实例的有效性?
  2. 如何检查数字签名文档是否使用从自定义列表的已知 CA 派生的证书签名?

最佳答案

从每个签名者的 CAdES 签名中提取签名者的证书以及作为 X509Certificate 列表的中间证书。还构建一个包含所有根 CA 证书的集合

然后你可以使用这个(稍微改编)example code使用 Java 和 BouncyCaSTLe 来验证和构建认证链。验证成功返回认证链

public PKIXCertPathBuilderResult verifyCertificateChain(
     X509Certificate cert, 
     Set<X509Certificate> trustedRootCerts,
     Set<X509Certificate> intermediateCerts) throws GeneralSecurityException {

    // Create the selector that specifies the starting certificate
    X509CertSelector selector = new X509CertSelector(); 
    selector.setCertificate(cert);

    // Create the trust anchors (set of root CA certificates)
    Set<TrustAnchor> trustAnchors = new HashSet<TrustAnchor>();
    for (X509Certificate trustedRootCert : trustedRootCerts) {
        trustAnchors.add(new TrustAnchor(trustedRootCert, null));
    }

    // Configure the PKIX certificate builder algorithm parameters
    PKIXBuilderParameters pkixParams = 
        new PKIXBuilderParameters(trustAnchors, selector);

    // Disable CRL checks (this is done manually as additional step)
    pkixParams.setRevocationEnabled(false);

    // Specify a list of intermediate certificates
    // certificate itself has to be added to the list 
    intermediateCerts.add(cert); 
    CertStore intermediateCertStore = CertStore.getInstance("Collection",
        new CollectionCertStoreParameters(intermediateCerts), "BC");
    pkixParams.addCertStore(intermediateCertStore);

    // Build and verify the certification chain
    CertPathBuilder builder = CertPathBuilder.getInstance("PKIX", "BC");
    PKIXCertPathBuilderResult result = 
        (PKIXCertPathBuilderResult) builder.build(pkixParams);
    return result;
}

如果你不想处理复杂的 CAdES,我建议使用 SD-DSS开源项目

关于java - 根据 Java 中的自定义信任列表检查证书有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42527241/

相关文章:

java - 在 android 库项目中使用 Dagger2 在运行时抛出 `NoClassDefFoundError`

WCF 4 - TransportWithMessageCredential 使用 X.509 证书进行传输和消息安全

c# - 为客户验证证书

security - Microsoft.Owin.Security.ActiveDirectory 是用于制作使用 AD 的 Owin 身份验证中间件吗?

apache-flex - 哈希值不匹配(可能与编码有关?)

java - 当存在相同别名时,从 Windows-MY 获取证书

java - 自定义 Java 生产者中的 Kafka SSL 握手失败

java - Apache Camel : Adding parameters to throwException statement

Java 程序测试删除最多一个元素后严格递增的数组

android - 如何安全地临时存储密码?