it-swarm.com.de

SSL-Neuling: Benötigt der HTTPS-Client auch ein Zertifikat?

Ich rufe eine HTTPS-URL über ein Java Programm) auf. Muss mein Java Client) dem Server ein Zertifikat bereitstellen, um diese Verbindung herzustellen? Mit anderen Worten: Benötige ich mein eigenes Zertifikat oder reicht das Zertifikat des Servers (das seinen öffentlichen Schlüssel enthält) aus?

10
AbuMariam

Hängt davon ab, was Sie tun und was Sie überprüfen möchten. Wenn Sie auf Daten zugreifen und sicherstellen möchten, dass der Server, der den entsprechenden privaten Schlüssel kennt, Ihnen Daten sendet (z. B. wenn Sie auf eine Webseite zugreifen), benötigen Sie kein eigenes Zertifikat.

Wenn der Server überprüfen möchte, ob es sich bei dem Client um einen vordefinierten Client handelt, der einen privaten Schlüssel kennt, der einem öffentlichen Schlüssel entspricht, der als gültige Quelle erkannt wurde, benötigt Ihr Client ein Zertifikat. Dies wird normalerweise verwendet, wenn zwei Server miteinander kommunizieren. Sie signieren die Daten jeweils mit ihrem eigenen privaten Schlüssel und können überprüfen, ob die Daten von einer bekannten Quelle stammen, indem sie mit öffentlichen Schlüsseln vergleichen. Es kann auch mit einigen APIs verwendet werden, auf die nur bestimmte Clients zugreifen sollen.

Vermutlich benötigen Sie daher kein eigenes Zertifikat für Ihren Client - wenn Sie dies tun, wird es vom Server im Allgemeinen ziemlich gut dokumentiert.

15
Matthew

Im Allgemeinen benötigen die meisten Webserver, auf denen HTTPS ausgeführt wird, kein Zertifikat des Clients. Wenn der Server die Authentifizierung des Clients erfordert, erfolgt dies häufig über Anmeldeinformationen (z. B. Benutzername und Kennwort).

Die Umkehrung ist jedoch im Allgemeinen nicht der Fall - d. H. Die meisten Clients verlangen von Webservern ein gültiges Zertifikat, das von einer anerkannten Zertifizierungsstelle signiert ist. Es liegt in der Verantwortung des Clients, die Gültigkeit des Zertifikats zu überprüfen. Andernfalls kann der Client nicht sicher sein, dass er tatsächlich mit dem Server verbunden ist, zu dem er eine Verbindung herstellen möchte, und dass er nicht MITM-fähig ist.

5
mti2935

Ich habe es versucht und der Client benötigt definitiv kein Zertifikat oder einen vordefinierten Schlüssel.

Vielmehr erstellt der Client nach Erhalt eines öffentlichen Schlüssels (der Teil des Zertifikats ist) vom Server ein Geheimnis "on the fly" und verschlüsselt es mit dem öffentlichen Schlüssel aus dem Serverzertifikat. Der Client sendet das verschlüsselte Geheimnis im Rahmen des Handshakes an den Server. Nur der Server kann die Nachricht mit dem Geheimnis vom Client entschlüsseln, solange nur der Server über den privaten Schlüssel verfügt, der dem öffentlichen Schlüssel entspricht, den er im Zertifikat gesendet hat. Sowohl der Client als auch der Server verwenden dann das sicher übertragene Geheimnis, um die Konversation fortzusetzen.

Clientschlüssel sind nur erforderlich, wenn der Server die Identität des Clients bestätigen muss. In diesem Fall können Client und Server miteinander kommunizieren, indem sie stattdessen Nachrichten senden, die mit den öffentlichen Schlüsseln der anderen verschlüsselt sind.

Sie können dies in Aktion sehen, indem Sie Ihren Code mit der folgenden jvm-Option ausführen:

Djavax.net.debug = ssl, Handshake

Der Client und der Server können sich auf eine Reihe verschiedener Verschlüsselungssysteme einigen, mit denen das erfundene Geheimnis ausgetauscht und dann verwendet werden kann. Auf meinem Testfeld wurde standardmäßig die Verschlüsselung mit elliptischen Kurven verwendet, wie unter beschrieben

https://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art06

3
Matt