2016-07-11 7 views
1

Ich schreibe gerade einen Netzwerk-TCP-Server mit SSL. In der Produktion benötigen wir schließlich, dass sich Clients mit einem Zertifikat authentifizieren.Java SSL Zertifikatsperrungsprüfung

Um Zertifikate im Notfall zu widerrufen, möchten wir auch eine CRL erstellen.

Meine Frage ist: Prüft Java CRLs (wenn mit dem Zertifikat zur Verfügung gestellt) out-of-the-Box oder muss ich solche Prüfungen manuell implementieren?

Zum Testen bereitete ich ein Zertifikat mit einem CRL-Satz vor, aber Java scheint nicht zu versuchen, es zu validieren (ich habe es auf einen lokalen Webserver fallen lassen und es gibt keinen Zugriff).

Ich fand nur die com.sun.net.ssl.checkRevocation = True VM-Option, aber offenbar fragt es nicht die CRL. VM-Debugging auf java.security.debug = CertPath keine Ausgabe erzeugen, entweder ...

Java scheint Klassen bezogen zu haben in seinen Subsysteme (zB java.security.cert.X509CRLSelector), aber es kommt natürlich nicht ins Spiel.

Ich schrieb ein kleinen Maven-Stil-Projekt mit Apache Mina als Client-Server, der einen SSL-Kontext basierend auf Schlüssel/Truststores und selbstsignierte Zertifikate für Client/Server initialisiert, die hier als ZIP-Archiv heruntergeladen werden kann: https://www.dropbox.com/s/3fqmd1v9mn2a5ve/ssltest.zip?dl=0

+0

Standardmäßig überprüft Java nicht CRL, wenn Sie benötigen, müssen Sie benutzerdefinierte Zertifikat Validator erstellen. –

+0

Dies kann Ihnen helfen https://www.java.com/de/download/help/revocation_options.xml –

+0

Mögliche Duplikate von [CRL Verifikation in Java] (http://stackoverflow.com/questions/30903993/crl-verification -in-java) –

Antwort

7

Ich habe mir überlegt, wie ich die CRL-Prüfung in einem SSLContext aktivieren kann, ohne einen benutzerdefinierten Validator zu implementieren, wie in den Kommentaren vorgeschlagen.

Es geht hauptsächlich darum, die TrustManager von SSLContext mit einer Sperrprüfung zu initialisieren, nur ein paar Zeilen, keine benutzerdefinierte Prüflogik und die CRL wird nun automatisch überprüft, ebenso wie der Verifikationsweg.

Hier ist ein Ausschnitt ...

KeyStore ts = KeyStore.getInstance("JKS"); 
FileInputStream tfis = new FileInputStream(trustStorePath); 
ts.load(tfis, trustStorePass.toCharArray()); 

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

// initialize certification path checking for the offered certificates and revocation checks against CLRs 
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX"); 
PKIXRevocationChecker rc = (PKIXRevocationChecker)cpb.getRevocationChecker(); 
rc.setOptions(EnumSet.of(
    PKIXRevocationChecker.Option.PREFER_CRLS, // prefer CLR over OCSP 
    PKIXRevocationChecker.Option.ONLY_END_ENTITY, 
    PKIXRevocationChecker.Option.SOFT_FAIL, // handshake should not fail when CRL is not available 
PKIXRevocationChecker.Option.NO_FALLBACK)); // don't fall back to OCSP checking 

PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(ts, new X509CertSelector()); 
pkixParams.addCertPathChecker(rc); 

tmf.init(new CertPathTrustManagerParameters(pkixParams)); 
// init KeyManagerFactory 
kmf.init(...) 

SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(kmf.getKeyManagers), tmf.getTrustManagers(), null); 

, die im Wesentlichen taten, was ich in meiner Anwendung benötigt werden, zu überprüfen, ob ein Zertifikat auf das Client ausgegeben wird, in unserer CRL widerrufen. Nur die End-Entität zu prüfen und zuzulassen, dass die CRL-Prüfung fehlschlägt, wird akzeptiert, da es sich um unsere gesamte Infrastruktur handelt.

+0

Hey, gibt es eine ähnliche Lösung für Java 1.7? – mdavid

+0

@mdavid: Sorry, ich habe es abgelehnt, dir diese Antwort ein paar Mal zu geben, aber vielleicht solltest du Java 8 (3 Jahre nach der Veröffentlichung?) Ausprobieren. Es gab Tonnen von Verbesserungen im Sicherheitsstapel: http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html Wie der _PKIXRevocationChecker _ sogar im Änderungsprotokoll erwähnt wird Ich nehme an, dass es in 1.7 keine Standardlösung für die Überprüfung von Zertifikaten gibt. – DoNuT

+0

Hi @DoNuT, kümmert es sich darum, CRL von einem entfernten Standort (im CERT) zu holen und es bis zur nächsten Aktualisierungszeit zwischenzuspeichern? Und dann die neue CRL wieder holen? Danke im Voraus. – ramtech