Parsowanie i sprawdzanie poprawności certyfikatu Java X509

Próbuję przetworzyć certyfikaty X509 w kilku krokach i napotkać kilka problemów. Jestem nowym użytkownikiem JCE, więc nie jestem jeszcze na bieżąco z wszystkim.

Chcemy być w stanie przeanalizować kilka różnych certyfikatów X509 opartych na różnych kodowaniach (PEM, DER i PCKS7). Wyeksportowałem ten sam certyfikat zhttps://belgium.be w formacie PEM i PCKS7 przy użyciu FireFox (certyfikat z łańcuchem). Zostawiłem kilka linii, które nie są potrzebne do zadawania pytań

<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>

Ten kod działa dobrze, ponieważ pracuję z FileInputStream zamiast BufferedInputStream dla PCKS7, co, jak sądzę, jest dość dziwne? Ale mogę z tym żyć.

Następnym krokiem jest walidacja tych łańcuchów certyfikatów. 1) Sprawdź, czy wszystkie certyfikaty mają prawidłową datę (łatwo) 2) Sprawdź poprawność łańcucha certyfikatów przy użyciu protokołu OCSP (i cofnij do listy CRL, jeśli w certyfikacie nie znaleziono adresu URL protokołu OCSP). Tutaj nie jestem całkowicie pewien, jak sobie z tym poradzić.

Używam Sun JCE, ale wygląda na to, że nie ma zbyt wielu dostępnych dokumentów (w przykładach)?

Najpierw stworzyłem prostą implementację, która sprawdza tylko łańcuch bez przechodzenia przez testy OCSP / CRL.

<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>

To działa dobrze dla mojego certyfikatu PEM, ale nie dla certyfikatu PCKS7 (ten sam certyfikat, eksportowany tylko w innym formacie).java.security.cert.CertPathValidatorException: Ścieżka nie łączy się z żadną z kotwic zaufania.

Jedyną różnicą, jaką widzę, jest to, że kolejność, w jakiej powstaje CertPath, nie jest taka sama? Nie byłem w stanie zrozumieć, co poszło źle, więc zostawiłem to na razie i kontynuowałem z certyfikatem PEM, ale nazwijmy to PYTANIE 1;)

Następnie chciałem wdrożyć kontrolę OCSP. Widocznie, jeśli włączę OCSP przy użyciu:Security.setProperty („ocsp.enable”, „true”); i nastawparams.setRevocationEnabled (true); powinien być w stanie samodzielnie znaleźć adres URL OCSP, ale tak nie jest. Jaka ma być standardowa implementacja (PYTANIE 2)?java.security.cert.CertPathValidatorException: musi określić lokalizację obiektu odpowiadającego OCSP

Przechodząc obok tego, znalazłem sposób na pobranie url OCSP z certyfikatu za pomocą AuthorityInfoAccessExtension i tym podobnych.

Ale po ręcznym ustawieniu url OCSP we właściwości ocsp.url otrzymujęjava.security.cert.CertPathValidatorException: błąd odpowiedzi OCSP: UNAUTHORIZED

Wygląda na to, że brakuje mi wielu niezbędnych kroków, podczas gdy wiele referencji internetowych mówi o ustawieniuocsp.enable własność powinna być wszystkim, co musisz zrobić?

Być może któryś z was nie może mnie trochę poprowadzić przez ten proces? Pokaż, gdzie całkowicie się mylę :)

Następnym krokiem byłoby wdrożenie sprawdzania listy CRL, jeśli nie znaleziono żadnego protokołu OCSP, jeśli ktokolwiek mógłby wskazać dowolny przykład lub pokazać mi jakąś dokumentację na ten temat, byłoby to bardzo mile widziane!

Dzięki!

EDYTOWAĆ: Ponieważ sam nie pobiera właściwości, próbowałem ustawić wszystkie właściwości osobiście, korzystając z następujących:

<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>

Który daje wyjątek: java.security.cert.CertPathValidatorException: Nie można znaleźć certyfikatu odpowiadającego (ustawionego za pomocą właściwości zabezpieczeń OCSP).

questionAnswers(1)

yourAnswerToTheQuestion