2015-04-29 8 views
2

У меня есть цепочка сертификатов в качестве закодированного байта [] [] для проверки. У меня также есть файл доверия.Проверка цепочки сертификатов в Java из truststore

После создания X509Certificate [] из этого байтового массива [] [] и инициализации trustmanager, как я могу сообщить TrustManager, что X509Certificate []? Каков правильный способ сделать это?

Спасибо.

Пример кода:

int certVerify(byte certChain[][]) 
{ 
    CertificateFactory cf = CertificateFactory.getInstance("X509"); 
    X509Certificate certx[] = new X509Certificate[10]; 
    for(int i=0;i<certChain.length;i++) 
    { 
    certx[i] = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(certChain[i])); 
    } 

    KeyStore keyStore = KeyStore.getInstance("JKS"); 
    keyStore.load(new FileInputStream("cacerts.jks"),"123456".toCharArray()); 

    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustManagerFactory.init(keyStore); 
} 

ответ

4

Вам необходимо включить OCSP с необходимыми свойствами системы или получить CRL для каждого сертификата в цепочке, чтобы проверить статус отзыва. (В качестве альтернативы вы можете отключить проверку отзыва, сопутствующими рисками.)

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
List<Certificate> certx = new ArrayList<>(certChain.length); 
for (byte[] c : certChain) 
    certx.add(cf.generateCertificate(new ByteArrayInputStream(c))); 
CertPath path = cf.generateCertPath(certx); 
CertPathValidator validator = CertPathValidator.getInstance("PKIX"); 
KeyStore keystore = KeyStore.getInstance("JKS"); 
try (InputStream is = Files.newInputStream(Paths.get("cacerts.jks"))) { 
    keystore.load(is, "changeit".toCharArray()); 
} 
Collection<? extends CRL> crls; 
try (InputStream is = Files.newInputStream(Paths.get("crls.p7c"))) { 
    crls = cf.generateCRLs(is); 
} 
PKIXParameters params = new PKIXParameters(keystore); 
CertStore store = CertStore.getInstance("Collection", new CollectionCertStoreParameters(crls)); 
/* If necessary, specify the certificate policy or other requirements 
* with the appropriate params.setXXX() method. */ 
params.addCertStore(store); 
/* Validate will throw an exception on invalid chains. */ 
PKIXCertPathValidatorResult r = (PKIXCertPathValidatorResult) validator.validate(path, params); 
1

Существует некоторая хорошая информация о том, как реализовать один here

Или вы могли бы использовать BouncyCastle API, как описано here

Смежные вопросы