2016-09-11 1 views
3

Я использую следующий код для проверки X509Certificate в соответствии с рекомендациями here.PKIXCertPathBuilder не работает с провайдером Bouncy Castle, но работает с поставщиком по умолчанию (SUN)

static void verifyCertTrust(X509Certificate certificate, Set<X509Certificate> additionalCerts) throws CertificateException, NoSuchAlgorithmException, NoSuchProviderException, CertPathValidatorException, InvalidAlgorithmParameterException, CertPathBuilderException{ 

     Set<X509Certificate> trustedRoots = new HashSet<X509Certificate>(); 
     Set<X509Certificate> intermediateCerts = new HashSet<X509Certificate>(); 

     for (X509Certificate cert : additionalCerts) { 
      if(isSelfSigned(cert)){ 
       trustedRoots.add(cert); 
      } 
      else{ 
       intermediateCerts.add(cert); 
      } 
     } 

     Set<TrustAnchor> trustAnchors = new HashSet<TrustAnchor>(); 
     for (X509Certificate root : trustedRoots) { 
      trustAnchors.add(new TrustAnchor(root, null)); 
     } 

     X509CertSelector selector = new X509CertSelector(); 
     selector.setCertificate(certificate); 


     PKIXParameters parameters = new PKIXBuilderParameters(trustAnchors, selector); 
     parameters.setRevocationEnabled(false); 
     CertStore intermediateCertStore = CertStore.getInstance("Collection", new CollectionCertStoreParameters(intermediateCerts), "BC"); 
     parameters.addCertStore(intermediateCertStore); 

     CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX", "BC"); 
     cpb.build(parameters); 

    } 

Это работает Если удалить поставщика BC при получении экземпляра CertPathBuilder и пусть JVM использовать SUN поставщика по умолчанию. Однако с провайдером BC я получаю следующее исключение.

Exception in thread "main" java.security.cert.CertPathBuilderException: No certificate found matching targetContraints. 
    at org.bouncycastle.jce.provider.PKIXCertPathBuilderSpi.engineBuild(Unknown Source) 
    at java.security.cert.CertPathBuilder.build(Unknown Source) 
    at signer.GetPkcs11Key.verifyCertTrust(GetPkcs11Key.java:105) 
    at signer.GetPkcs11Key.main(GetPkcs11Key.java:71) 

Любые идеи, как я могу сделать эту работу с поставщиком BouncyCastle?

ответ

2

Свидетельство проверки должно быть в CertStore в вашем примере, так это добавить:

parameters.setRevocationEnabled...; 
//Add the certitificate to the cert store 
intermediateCerts.add(certificate); 
CertStore intermediateCertStore....