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).
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 –
cosa è 'cf' nel tuo esempio? – spy
È passato molto tempo, ma direi https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html –