Java Certificato X509 l’analisi e la validazione

Sto cercando di elaborare certificati X509 in diverse fasi e in esecuzione in un paio di problemi. Sono nuovo di JCE in modo non completamente aggiornato su tutto ciò che di sicurezza.

Vogliamo essere in grado di analizzare diversi certificati X509, basati su differenti codifiche (PEM, DER e PCKS7). Ho esportato il certificato stesso da https://belgium.be in PEM e PCKS7 formato utilizzando FireFox (certificato di catena). Ho lasciato 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 bene comedai come io lavoro con un FileInputStream invece di un BufferedInputStream per PCKS7, il che è molto strano, già penso? Ma posso vivere con esso.

Il passo successivo è quello di convalidare queste catene di certificati.
1) Controllare se tutti i certificati hanno una data valida (facile)
2) di Convalidare il certificato di catena di OCSP (e di riserva CRL se non OCSP URL è disponibile nel certificato). Questo è dove io non sono completamente sicuro di come gestire questo.

Sto usando il Sole JCE, ma sembra che non c’è molta documentazione disponibile (esempi) per questo?

Ho fatto una semplice applicazione che controlla solo la catena, senza passare attraverso il OCSP/controlli 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 PCKS7 certificato (stesso certifcate, solo esportati in altri formati).
java.di sicurezza.cert.CertPathValidatorException: il Percorso non catena con qualsiasi fiducia ancore.

L’unica differenza che riesco a vedere è che l’ordine in cui le CertPath è formata non è lo stesso? Non ero in grado di capire cosa c’era che non andava, così ho lasciato questo per ora e ‘ andato avanti con il certificato PEM, ma permette di chiamare questa DOMANDA 1 😉

Quello che volevo implementare successivamente è stato OCSP controllo.
A quanto pare se abilitare il protocollo OCSP utilizzando: di Sicurezza.setProperty(“ocsp.enable”, “true”); e impostare params.setRevocationEnabled(true);
si dovrebbe essere in grado di trovare l’URL OCSP in proprio, ma che non sembra essere il caso. Qual è la norma di attuazione che dovrebbe fare (DOMANDA 2)?
java.di sicurezza.cert.CertPathValidatorException: è Necessario specificare la posizione di un Risponditore OCSP

Va oltre questo, ho trovato un modo per recuperare l’url OCSP dal certificato utilizzando AuthorityInfoAccessExtension e tale.

Ma dopo aver impostato l’url OCSP manualmente in ocsp.url proprietà, sto diventando un java.di sicurezza.cert.CertPathValidatorException: OCSP errore di risposta: non autorizzato

Sembra che mi sto perdendo un sacco di passaggi necessari, mentre un sacco di riferimenti online dire impostazione del ocsp.attivare proprietà dovrebbe essere tutto quello che dovete fare?

Forse qualcuno di voi whizkids cant mi guida attraverso il processo un po’? Vedi, mi sono completamente sbagliato 🙂

Il passo successivo sarebbe l’implementazione di controlli CRL se non OCSP è stato trovato, se qualcuno potesse indicare qualche esempio o mi mostri un po ‘ di documentazione su questo sarebbe molto apprezzato!

Grazie!

EDIT:
Perché non raccogliere la proprietà sul proprio, ho cercato di impostare tutte le proprietà manualmente 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.di sicurezza.cert.CertPathValidatorException: Impossibile trovare il certificato risponditore (utilizzando il protocollo OCSP proprietà di sicurezza).

InformationsquelleAutor Driss Amri | 2012-04-06



One Reply
  1. 15

    Di riferimento per il futuro vi posto la risposta alla mia domanda (in parte almeno)

    CRL e OCSP controlli sono implementati in Java standard di attuazione già e non c’è bisogno di codice personalizzato o di altri fornitori (BC, ..). Sono disattivate per impostazione predefinita.

    Per attivare questa funzione, è necessario almeno impostare due parametri:

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

    Questo attiverà il protocollo OCSP verifica quando si tenta di convalidare il certificato percorso (PKIXCertPathValidatorResult.validate()).

    Quando si desidera aggiungere il ripiego di controllo per CRL se non OCSP è disponibile, è possibile aggiungere un’ulteriore proprietà:

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

    Un sacco di miei problemi stanno accadendo a causa del fatto che ho per il supporto di diversi formati di certificato (PKCS7, PEM). La mia applicazione funziona bene per PEM, ma dal momento che PKCS7 NON salva l’ordinazione 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à utile commento per altre persone, forse qualcuno può gettare una luce su come trovare il certificato di destinazione in unordered PKCS7 lista?

Lascia un commento