Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据Java中的自定义信任列表检查证书有效性_Java_Security_X509certificate - Fatal编程技术网

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

根据Java中的自定义信任列表检查证书有效性,java,security,x509certificate,Java,Security,X509certificate,我有一份用CAdES数字签名的文件。我使用BouncyCastle API获取签名者的X509Certificate[]实例,但假设该列表只包含一个元素 我需要在今天的日期验证此证书是否受信任,并且我不想使用系统的标准信任存储(通常用于信任SSL证书)。不,我想用类路径中的.cer文件列表建立我自己的信任列表。目前,单个CA是可信的,但很明显,将来可能会添加更多的证书 到目前为止,我已经阅读并尝试在代码中实现。我不需要SSLContext,我需要检查数字签名文档的有效性。我现在很困惑 X509T

我有一份用CAdES数字签名的文件。我使用BouncyCastle API获取签名者的
X509Certificate[]
实例,但假设该列表只包含一个元素

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

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

X509TrustManager
API只提供验证客户机/服务器证书的方法,但我的API只提供数字签名/不可否认使用标志

这些问题可以通过两种方式表述,从而得出相同的结论:

  • Java中的用户如何对照可加载到内存中的自定义根CA列表检查
    X509Certificate
    实例的有效性
  • 如何检查数字签名文档是否使用来自自定义列表的已知CA的证书签名

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

    然后您可以使用这个(稍微调整)来验证并使用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;
    }
    
    public PKIXCertPathBuilderResult verifyCertificateChain(
    X509证书,
    设置trustedRootCerts,
    Set intermediateCerts)引发GeneralSecurityException{
    //创建指定起始证书的选择器
    X509CertSelector=新的X509CertSelector();
    选择器。setCertificate(证书);
    //创建信任锚(根CA证书集)
    Set trustAnchors=newhashset();
    对于(X509Certificate trustedRootCerts:trustedRootCerts){
    添加(新信任锚(trustedRootCert,null));
    }
    //配置PKIX证书生成器算法参数
    PKIXBuilderParameters pkixParams=
    新的PKIXBuilderParameters(信任锚、选择器);
    //禁用CRL检查(这是作为附加步骤手动完成的)
    pkixParams.setRevocationEnabled(false);
    //指定中间证书的列表
    //必须将证书本身添加到列表中
    中级证书。添加(证书);
    CertStore intermediateCertStore=CertStore.getInstance(“集合”,
    新集合CertStoreParameters(intermediateCerts),“BC”);
    pkixParams.addCertStore(intermediateCertStore);
    //建立并验证认证链
    CertPathBuilder=CertPathBuilder.getInstance(“PKIX”、“BC”);
    PKIXCertPathBuilderResult结果=
    (PKIXCertPathBuilderResult)builder.build(pkixParams);
    返回结果;
    }
    

    如果您不想处理CAdES的复杂性,我建议您使用开源项目

    幸运的是,BouncyCastle通过提取签名者证书和文档哈希代码HMMM,为我处理CAdES的复杂性提供了很多帮助。。。不管怎样,我总是会遇到一个异常,“找不到与targetConstraints匹配的证书”。我试图从系统信任存储中加载trustedRootCerts,其中包含目标根CA(调试,我在内存存储中找到了正确的证书)。证书本身必须添加到中间列表
    intermediateCerts.add(cert)我链接的代码不正确。我已经用原始资料更新了链接。你能检查修改后的答案吗?将在接下来的几天内完成。目前,我通过假设路径长度始终为1(用户证书未由中间CA签名)解决了整个问题。作为大多数开发商,我落后于进度:-(