SSLSocket ignoriert Domänenkonflikte

8

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.

%Vor%

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?

    
Martin Ždila 31.07.2013, 14:05
quelle

2 Antworten

16

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.

%Vor%

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

    
Bruno 31.07.2013, 20:09
quelle
2

Der Hostname-Abgleich gehört nicht zu SSL, sondern ist Teil von HTTPS. Siehe zum Beispiel javax.net.ssl.HostnameVerifier.

Das von Ihnen angegebene Protokoll zeigt an, dass eine SSLException von HttpsURLConnection ausgelöst wurde.

    
EJP 31.07.2013 19:10
quelle

Tags und Links