Frage

Ich habe mit keytool einen Webdienst mit Server- und Client-Authentifizierung implementiert.Das Problem ist, dass diese Authentifizierung nicht funktioniert, wenn ich den Namen des Hosts nicht einbeziehe.Zum Beispiel:

keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost"

Aber ich brauche keine Validierung per Host oder IP und mag sie auch nicht.Gibt es eine Möglichkeit, dies zu vermeiden?

Danke.

War es hilfreich?

Lösung

SSL hat als Teil der Anforderungen die Validierung, dass das Zertifikat CN dem Hostnamen entspricht, mit dem Sie eine Verbindung herstellen. Wenn der CN nicht übereinstimmt, geht der Browser davon aus, dass Sie sich mit dem falschen Host und dem falschen Objekt verbinden.

Das gibt es nicht.

Andere Tipps

Ich stimme den anderen Postern zu: Wenn Sie SSL verwenden, sind Sie mit ziemlicher Sicherheit wollen Hostname -Überprüfung als Teil der SSL -Sicherheitsfunktion.

Abhängig von dem von Ihnen verwendeten Kunden kann dieses Problem sehr gut zu einem Weg gehen. Die Ingenieure werden die Hostname -Überprüfung in Testumgebungen für Debugging, Prototyping usw. umgehen. Wenn Sie einen Java -Client verwenden, der über httpsurlConnection eine Verbindung herstellt, wäre dies so einfach wie das Hinzufügen der Folgenden zu Ihrer Client -Klasse:

static {
    HttpsURLConnection.setDefaultHostnameVerifier( 
        new HostnameVerifier(){
            public boolean verify(String string,SSLSession ssls) {
            return true;
        }
    });
}

Der Sinn der Verwendung von SSL/TLS ist, dass der Kunde sicher sein kann, dass er sich mit dem richtigen Service verbindet, und nicht mit einem falschen Service, der versucht, sich als Real auszugeben. Wenn (hypothetisch) das Serverzertifikat keine Host -Identifizierungsinformationen enthalten sollte, war der Client, wenn der Server es verhandelte, das richtige.

In der Tat du Benötigen Sie eine Validierung nach DNS -Adresse, denn wenn Sie nicht Ihre SSL -Validierung nicht wertlos sind. (Oder zumindest nirgendwo so sicher wie möglich.)

Ich denke, theoretisch könnten Sie versuchen, Ihre Client/Server -Kommunikation über Kanäle zu machen, die auf andere Weise als SSL/TLS gesichert sind. Sie würden jedoch ernsthafte Fachwissen in der Sicherheits- und Verschlüsselungstechnologie von Java benötigen.

Die Standardlogik lautet:Wenn Sie Ihre Daten nicht schützen müssen, verwenden Sie kein SSL.Wenn Sie es schützen müssen, müssen Sie wissen, mit welchem ​​Host Sie eine Verbindung herstellen.Dazwischen sollte es nichts geben.

In einigen internen Umgebungen haben Sie jedoch möglicherweise ausreichend Kontrolle über das Netzwerk und die Konfiguration, um sich keine Sorgen zu machen.

Im letzteren Fall hängt die Lösung von den von Ihnen verwendeten Clientbibliotheken ab.Wenn Sie einen HTTP-Client verwenden, lesen Sie die SSL-Konfigurationsanleitung.Es kann sein, dass Sie keine eigene Implementierung benötigen SecureProtocolSocketFactory und kann einfach verwendet werden EasySSLProtocolSocketFactory.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top