2012-04-06 15 views
12

Sto cercando di elaborare i certificati X509 in diversi passaggi e in esecuzione in un paio di problemi. Sono nuovo di JCE quindi non ho ancora completamente aggiornato su tutto.Certificato Java X509 analisi e convalida

Vogliamo essere in grado di analizzare diversi certificati X509 basati su diverse codifiche (PEM, DER e PCKS7). Ho esportato lo stesso certificato da https://belgium.be in formato PEM e PCKS7 utilizzando FireFox (certificato inclusa catena). Ho lasciato fuori paio di linee che non sono necessari per le domande

public List<X509Certificate> parse(FileInputStream fis) { 
    /* 
    * Generate a X509 Certificate initialized with the data read from the inputstream. 
    * NOTE: Generation fails when using BufferedInputStream on PKCS7 certificates. 
    */ 
    List<X509Certificate> certificates = null; 
     log.debug("Parsing new certificate."); 
     certificates = (List<X509Certificate>) cf.generateCertificates(fis); 
    return certificates; 
    } 

Questo codice funziona benissimo aslong come io lavoro con un FileInputStream invece di un BufferedInputStream per PCKS7, che è abbastanza strano già penso? Ma posso conviverci.

Il passaggio successivo consiste nel convalidare queste catene di certificati. 1) Verificare se tutti i certificati hanno una data valida (facile) 2) Convalidare la catena di certificati utilizzando OCSP (e fallback a CRL se non viene trovato nessun URL OCSP nel certificato). Questo è dove non sono completamente sicuro su come gestirlo.

Sto utilizzando Sun JCE, ma sembra che non ci sia molta documentazione disponibile (negli esempi) per questo?

Prima ho fatto una semplice implementazione che controlla solo la catena senza passare attraverso i controlli OCSP/CRL.

private Boolean validateChain(List<X509Certificate> certificates) { 
    PKIXParameters params; 
    CertPath certPath; 
    CertPathValidator certPathValidator; 
    Boolean valid = Boolean.FALSE; 

    params = new PKIXParameters(keyStore); 
    params.setRevocationEnabled(false); 

    certPath = cf.generateCertPath(certificates); 
    certPathValidator = CertPathValidator.getInstance("PKIX"); 

    PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult) 
    certPathValidator.validate(certPath, params); 

     if(null != result) { 
     valid = Boolean.TRUE; 
     } 
    return valid; 
} 

Questo sta lavorando bene per il mio certificato PEM, ma non per il certificato PCKS7 (stesso certifcate, ha esportato solo in altro formato). java.security.cert.CertPathValidatorException: percorso non concatena con nessuno degli ancoraggi di trust.

L'unica differenza che sono in grado di vedere è che l'ordine in cui è formato il CertPath non è lo stesso? Non sono stato in grado di capire cosa stava andando storto, quindi ho lasciato questo per ora e ho continuato a utilizzare il certificato PEM, ma chiamiamola QUESTION 1;)

Quello che volevo implementare in seguito è stato il controllo OCSP. Apparentemente se abilito OCSP usando: Security.setProperty ("ocsp.enable", "true"); e impostare params.setRevocationEnabled (true); dovrebbe essere in grado di trovare l'URL OCSP da solo, ma non sembra essere il caso. Cosa dovrebbe fare l'implementazione standard (QUESTION 2)? java.security.cert.CertPathValidatorException: necessario specificare la posizione di un OCSP Responder

Andando oltre questo, ho trovato un modo per recuperare l'URL OCSP dal certificato utilizzando AuthorityInfoAccessExtension e così via.

Ma dopo aver impostato manualmente l'URL OCSP nella proprietà ocsp.url, sto diventando un java.security.cert.CertPathValidatorException: OCSP Risposta: NON AUTORIZZATO

Sembra che mi manca un molti passaggi necessari mentre un sacco di riferimenti online dicono che impostare la proprietà ocsp.enable dovrebbe essere tutto ciò che devi fare?

Forse qualcuno di voi, i whizkid, non può guidarmi un po 'durante il processo?Mostrami dove mi sto sbagliando :)

Il prossimo passo sarebbe l'implementazione dei controlli CRL se non fosse stato trovato alcun OCSP, se qualcuno potesse indicare qualche esempio o mostrarmi qualche documentazione su questo sarebbe anche molto apprezzato!

Grazie!

EDIT: Poiché non è far salire le proprietà sul proprio, ho cercato di impostare tutte le proprietà di me utilizzando il seguente:

// Activate OCSP 
     Security.setProperty("ocsp.enable", "true"); 
     // Activate CRLDP -- no idea what this is 
     Security.setProperty("com.sun.security.enableCRLDP", "true"); 

     X509Certificate target = (X509Certificate) certPath.getCertificates().get(0); 
     Security.setProperty("ocsp.responderURL","http://ocsp.pki.belgium.be/"); 
     Security.setProperty("ocsp.responderCertIssuerName", target.getIssuerX500Principal().getName()); 
     Security.setProperty("ocsp.responderCertSubjectName", target.getSubjectX500Principal().getName()); 
     Security.setProperty("ocsp.responderCertSerialNumber", target.getSerialNumber().toString(16)); 

che dà un'eccezione: java. security.cert.CertPathValidatorException: impossibile trovare il certificato del risponditore (impostato utilizzando le proprietà di sicurezza OCSP).

+0

OSCPChecker sembra eseguire questa operazione nel metodo getOCSPServerURI: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/security/provider/certpath/OCSPChecker .java # OCSPChecker.getOCSPServerURI% 28sun.security.x509.X509CertImpl% 2Cjava.lang.String% 29 –

+0

cosa è 'cf' nel tuo esempio? – spy

+0

È passato molto tempo, ma direi https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html –

risposta

15

Per riferimento futuro vi posterò la risposta alla mia domanda (in parte atleast)

OCSP e CRL controlli sono implementati nella realizzazione standard di Java già e non c'è alcuna necessità di codice personalizzato o di altri fornitori (BC , ..). Sono disabilitati per impostazione predefinita.

Per abilitare questa, è necessario impostare atleast due parametri:

(PKIXParameters or PKIXParameterBuilder) params.setRevocationEnabled(true); 
Security.setProperty("ocsp.enable", "true"); 

Questo attiverà OCSP verifica quando si sta cercando di convalidare il percorso dei certificati (PKIXCertPathValidatorResult.validate()).

Quando si desidera aggiungere il controllo di ripiego per CRL se non OCSP è disponibile, aggiungere una proprietà adizionale:

System.setProperty("com.sun.security.enableCRLDP", "true"); 

Un sacco di miei problemi stanno accadendo a causa del fatto che devo sostenere certificato diverso formati (PKCS7, PEM). La mia applicazione funziona bene per PEM, ma dal momento che PKCS7 non salva ordinamento dei certificati della catena è un po 'più difficile (http://bugs.sun.com/view_bug.do?bug_id=6238093)

X509CertSelector targetConstraints = new X509CertSelector(); 

targetConstraints.setCertificate(certificates.get(0)); 
// Here's the issue for PKCS7 certificates since they are not ordered, 
// but I havent figured out how I can see what the target certificate 
// (lowest level) is in the incoming certificates.. 

PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, targetConstraints); 

Spero che questo sarà osservazioni utili per altre persone e, forse qualcuno può fare luce su come trovare il certificato di destinazione in una lista PKCS7 non ordinata?