2010-04-23 7 views
5

Ich habe einen sehr grundlegenden Zweifel an SSL HandShake. Angenommen, wir haben einen Server S, der selbstsignierte Zertifikate verwendet. Ich schreibe einen Java-Client C, der sich mit dem S verbindet. Wenn C sich mit S verbindet, holt C Zertifikate von S und speichert sie in seinem Truststore und der restliche Teil der Kommunikation schreitet voran. Nach einiger Zeit benutze ich das gleiche C, um mit dem S zu verbinden, also werde S die Zertifikate erneut an C senden, oder C wird die Zertifikate verwenden, die bereits im Truststore gespeichert sind. Ich bin nicht gut in SSL und zugrunde liegende Implementierung der Truststore-Funktionalität in Java.SSL Handshake auf Java Client

Werden S die Zertifikate C unveränderliche von senden, ob die C-Zertifikate auf seinen Trusts hat ?? Ich glaube, wenn ich Zertifikate im Truststore C habe, trusts S und C werde nicht nach Zertifikaten fragen, wenn ich wieder verbinde? Ist meine Annahme richtig?

Ist der Prozess gleiche gilt für selbstsignierte Zertifikate und CA-Zertifikate ??

Vielen Dank im Voraus.

+1

Ich schrieb einen https-Simulator in Java. Ich konnte 12.000 - 15.000 Anfragen in 15 Sekunden mit selbstsignierten Zertifikaten simulieren. Aber es dauert 3 Minuten mit CA-Zertifikaten? Ich verstehe wirklich nicht, warum das passiert. Gibt es einen feinen Unterschied in der Handhabung von selbstsignierten Zertifikaten im Vergleich zu CA-Zertifikaten? – JKV

Antwort

6

Das ist mein Verständnis von SSL, ich bin kein Experte in diesem Thema, aber in Ermangelung anderer Antworten hoffentlich kann ich zumindest gibt Ihnen einige Dinge zu denken.

Wenn Sie ein selbstsigniertes Zertifikat für den Server erstellen, müssen Sie dies dem Client irgendwie hinzufügen. Es wird nicht installiert, sobald der Client eine Verbindung herstellt. Anderenfalls könnte ein Server durch das Senden eines selbstsignierten Zertifikats vertrauenswürdig werden zu allem, was versucht, sich mit ihm zu verbinden. In meiner Anwendung wird das Serverzertifikat beim Start in den Truststore des Clients geladen, indem man javax.net.ssl.truststore ("path/to/server/cert") angibt;

Nun, wenn der Client mit dem Server verbindet nimmt die Handshake-Platz. An diesem Punkt wird der Server sein Zertifikat an den Client senden und der Client wird bestätigen, dass es tatsächlich vom Server kommt, indem er es gegen seinen Truststore abfragt (an dieser Stelle ist es egal, ob es selbstsigniert ist oder nicht, weil der Client sowohl die Stammzertifikate überprüfen sollte als auch die, die Sie hinzugefügt haben). Wenn das vom Server gesendete Zertifikat auscheckt, wird die Kommunikation fortgesetzt und die Daten werden geteilt.

Es ist eine Form der Sitzung behvaiour, die stattfindet, dass die Kommunikation ohne fortfahren können Zertifikate auszutauschen jedes Mal. Aber ich glaube, dass dies auf die einzelne Verbindung beschränkt ist. Sobald Sie also die Verbindung schließen und eine neue Verbindung erstellen, muss der Prozess wiederholt werden, d. H. Der Server muss sein Zertifikat erneut zur Validierung senden.

Also zusammenfassend: das selbstsignierte Server-Zertifikat muss auf dem Client außerhalb der SSL-Kommunikation installiert werden (wie, wie Root-CA-Zertifikate in einem Produkt von Anfang an installiert sind). Jede SSL-Verbindung zwischen Client und Server erfordert, dass der Server sein Zertifikat an den Client sendet, damit es den Truststore überprüfen kann.

Es ist möglich, dass der Server die Fortsetzung von Sitzungen zulässt. In diesem Fall wird das Zertifikat nicht erneut gesendet (aber ich bin nicht sicher, unter welchen Bedingungen eine Sitzung fortgesetzt werden kann, möglicherweise auf verschiedenen Servern konfigurierbar) .

Hoffe das zumindest gibt Ihnen etwas zum Nachdenken.

+0

Das ist ziemlich gut.Die Wiederaufnahmefähigkeit ist nicht an Verbindungen gebunden; In der Regel ist es einfach eine Sitzung, die eine bestimmte Lebensdauer hat, normalerweise fünf Minuten, während der neue SSL-Verbindungen zwischen denselben SSL-Peers das zu Beginn generierte Master-Secret wiederverwenden können. –

+0

Ich schrieb einen https-Simulator in Java. Ich konnte 12.000 - 15.000 Anfragen in 15 Sekunden mit selbstsignierten Zertifikaten simulieren. Aber es dauert 3 Minuten mit CA-Zertifikaten? Ich verstehe wirklich nicht, warum das passiert. Gibt es einen feinen Unterschied in der Handhabung von selbstsignierten Zertifikaten im Vergleich zu CA-Zertifikaten? – JKV

+1

Ich glaube nicht, dass es Unterschiede in der Handhabung gibt, aber es könnte Unterschiede in den Zertifikaten geben. Vielleicht ist die im selbstsignierten Zertifikat verwendete Schlüsselgröße kürzer als die CA-Zertifikate? Die CA-Zertifikate können eine lange Kette von Zertifikaten haben. Um das Client-Zertifikat zu überprüfen, muss es eine längere Liste vertrauenswürdiger Zertifikate durchsehen. Es gibt Möglichkeiten, diese Dinge mit openssl zu betrachten, denke ich. – DaveJohnston