Ich lese vom SSL-Socket, aber der Host stimmt nicht mit dem Zertifikat überein (zB host = "localhost"
). Ich würde die Ausnahme erwarten, aber der folgende Code spricht problemlos mit dem Remote-Server ohne Probleme.
Deshalb habe ich einen anderen Ansatz versucht:
%Vor% Leider bekomme ich immer noch keine SSL-Ausnahme, nur WARN in den Protokollen:
2013-07-31 16:02:27,182 WARN nio - javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
Wie bekomme ich die SSL-Ausnahme, wenn das Zertifikat nicht übereinstimmt?
Die SSL / TLS-Protokollspezifikation ist modular und von den Spezifikationen zur Authentifizierung des Remote-Hosts getrennt. Diese anderen Spezifikationen sind in zwei Kategorien unterteilt: Überprüfen, ob das Zertifikat selbst vertrauenswürdig ist (RFC 3280/5280) und Überprüfen der Identität im Zertifikat (RFC 6125 oder RFC 2818 für HTTPS).
JSSE integriert das SSL-Protokoll und die Verifizierung des Zertifikats in der API SSLSocket
(oder SSLEngine
), aber nicht mit der Verifizierung des Bezeichners (was ebenso wichtig ist).
Dies liegt hauptsächlich an der Tatsache, dass SSLSocket
/ SSLEngine
für jedes Anwendungsprotokoll (zB HTTP, IMAP, SMTP, LDAP, ...) gelten kann, aber die Regeln für die Überprüfung der Kennung waren unterschiedlich Spezifikationen (mit kleinen Variationen), bis RFC 6125 (die noch ziemlich neu ist).
HttpsURLConnection
behandelt beides, weil es auch ein HostnameVerifier
verwendet, das der HTTPS-Spezifikation folgt (RFC 2818, Abschnitt 3.1). Dies geschieht getrennt von der API SSLSocket
/ SSLEngine
.
Für andere Protokolle müssen Sie möglicherweise implementieren, was die Protokollspezifikation sagt.
Seit Java 7 gibt es einen Mechanismus, um die Identität des Zertifikats direkt als Teil der API SSLSocket
/ SSLEngine
zu verifizieren.
Wenn Sie dies verwenden, sollte es eine Ausnahme auslösen, wenn der Hostname nicht übereinstimmt.
Es gibt keine wesentlichen Unterschiede zwischen HTTPS und den einheitlicheren Spezifikationen in RFC 6125 (neben der Tatsache, dass letztere IP-Adressen außerhalb des Geltungsbereichs betrachtet). Selbst wenn Sie kein HTTPS verwenden, ist es immer noch sinnvoll, die Identifikationsspezifikationen für andere Protokolle zu verwenden. (Vielleicht könnte ein "RFC 6125" Endpunktidentifikationsalgorithmus in späteren Versionen von Java enthalten sein.)