Parsing und Validierung von Java X509-Zertifikaten

Ich versuche, X509-Zertifikate in mehreren Schritten zu verarbeiten. Dabei treten einige Probleme auf. Ich bin neu bei JCE und daher noch nicht auf dem neuesten Stand.

Wir möchten in der Lage sein, mehrere verschiedene X509-Zertifikate basierend auf verschiedenen Codierungen (PEM, DER und PCKS7) zu analysieren. Ich habe das gleiche Zertifikat von exportierthttps://belgium.be im PEM- und PCKS7-Format mit FireFox (Zertifikat einschließlich Kette). Ich habe ein paar Zeilen weggelassen, die für die Fragen nicht benötigt werden

<code>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;
  }
</code>

Dieser Code funktioniert einwandfrei, solange ich mit einem FileInputStream anstelle eines BufferedInputStream für PCKS7 arbeite. Aber ich kann damit leben.

Der nächste Schritt besteht darin, diese Zertifikatketten zu validieren. 1) Überprüfen Sie, ob alle Zertifikate ein gültiges Datum haben (einfach). 2) Überprüfen Sie die Zertifikatskette mit OCSP (und greifen Sie auf die CRL zurück, wenn das Zertifikat keine OCSP-URL enthält.). Hier bin ich mir nicht ganz sicher, wie ich damit umgehen soll.

Ich verwende Sun JCE, aber es scheint nicht so viel Dokumentation (in Beispielen) dafür zu geben?

Ich habe zuerst eine einfache Implementierung erstellt, die nur die Kette überprüft, ohne die OCSP / CRL-Überprüfungen zu durchlaufen.

<code>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;
 }
</code>

Dies funktioniert problemlos für mein PEM-Zertifikat, jedoch nicht für das PCKS7-Zertifikat (dasselbe Zertifikat, das nur in einem anderen Format exportiert wird).java.security.cert.CertPathValidatorException: Der Pfad wird mit keinem der Vertrauensanker verkettet.

Der einzige Unterschied, den ich feststellen kann, ist, dass die Reihenfolge, in der der CertPath gebildet wird, nicht dieselbe ist. Ich konnte nicht herausfinden, was schief gelaufen ist, also habe ich dies vorerst aufgegeben und mit dem PEM-Zertifikat weitergearbeitet, aber nennen wir diese FRAGE 1;)

Was ich später implementieren wollte, war die OCSP-Überprüfung. Anscheinend, wenn ich OCSP mit aktiviere:Security.setProperty ("ocsp.enable", "true"); und setzenparams.setRevocationEnabled (true); es sollte in der Lage sein, die OCSP-URL selbst zu finden, aber das scheint nicht der Fall zu sein. Was soll die Standardimplementierung tun (FRAGE 2)?java.security.cert.CertPathValidatorException: Muss den Speicherort eines OCSP-Responders angeben

Ich habe darüber hinaus eine Möglichkeit gefunden, die OCSP-URL mithilfe von AuthorityInfoAccessExtension und dergleichen aus dem Zertifikat abzurufen.

Aber nachdem ich die OCSP-URL manuell in der Eigenschaft ocsp.url festgelegt habe, erhalte ich einejava.security.cert.CertPathValidatorException: OCSP-Antwortfehler: UNAUTHORIZED

Es scheint, als würde mir eine Menge notwendiger Schritte fehlen, während viele Online - Referenzen sagen, dass das Setzen derocsp.enable Eigentum sollte alles sein, was Sie tun müssen?

Vielleicht kann mich keiner von euch ein bisschen durch den Prozess führen? Zeig mir, wo ich völlig falsch liege :)

Der nächste Schritt wäre die Implementierung von CRL-Überprüfungen, wenn kein OCSP gefunden würde. Wenn jemand ein Beispiel nennen oder mir eine Dokumentation dazu zeigen könnte, wäre dies ebenfalls sehr dankbar!

Vielen Dank!

BEARBEITEN: Da die Eigenschaften nicht eigenständig abgerufen werden, habe ich versucht, alle Eigenschaften mithilfe der folgenden Optionen selbst festzulegen:

<code>    // 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));
</code>

Hier gibt es eine Ausnahme: java.security.cert.CertPathValidatorException: Das Zertifikat des Responders kann nicht gefunden werden (wird mithilfe der OCSP-Sicherheitseigenschaften festgelegt).

Antworten auf die Frage(1)

Ihre Antwort auf die Frage