Wie funktioniert SSL wirklich?

142

Wie funktioniert SSL?

Wo ist das Zertifikat auf dem Client (oder Browser?) Und dem Server (oder Webserver?) Installiert?

Wie beginnt der Vertrauens- / Verschlüsselungs- / Authentifizierungsprozess, wenn Sie die URL in den Browser eingeben und die Seite vom Server abrufen?

Wie erkennt das HTTPS-Protokoll das Zertifikat? Warum kann HTTP nicht mit Zertifikaten arbeiten, wenn es die Zertifikate sind, die die gesamte Vertrauens- / Verschlüsselungs- / Authentifizierungsarbeit ausführen?

Vicky
quelle
24
Ich denke, dies ist eine vernünftige Frage - zu verstehen, wie SSL funktioniert, ist Schritt 1, die korrekte Implementierung ist Schritt 2 bis Schritt unendlich.
Synthesizerpatel
4
Hier ist ein guter Durchlauf des https-Handshake-Prozesses auf Byte-Ebene
Rob Church
5
@StingyJack Sei hier kein Politik-Nazi. Die Leute suchen Hilfe. Verweigern Sie ihnen nicht alle Unterstützung, da Sie feststellen, dass die Frage nicht perfekt mit den Regeln übereinstimmt.
Koray Tugay
1
@KorayTugay - niemand verweigert die Unterstützung. Dies gehört zwar zu Security oder Sysadmin, wo es besser ausgerichtet ist, aber OP würde in diesem Forum normalerweise davon profitieren, wenn es etwas Programmierkontext hinzufügt, anstatt eine allgemeine IT-Frage zu stellen. Wie viele Personen erhalten Fragen, wenn sie nicht an ein bestimmtes Programmierproblem gebunden sind? Wahrscheinlich zu viele, daher mein stupendes OP, um diese Assoziation herzustellen.
StingyJack

Antworten:

144

Hinweis: Ich habe meine ursprüngliche Antwort sehr hastig geschrieben, aber seitdem hat sich dies zu einer ziemlich beliebten Frage / Antwort entwickelt. Deshalb habe ich sie ein wenig erweitert und präzisiert.

TLS-Funktionen

"SSL" ist der Name, der am häufigsten verwendet wird, um auf dieses Protokoll zu verweisen. SSL bezieht sich jedoch speziell auf das proprietäre Protokoll, das Netscape Mitte der 90er Jahre entwickelt hat. "TLS" ist ein IETF-Standard, der auf SSL basiert, daher werde ich TLS in meiner Antwort verwenden. Heutzutage besteht die Wahrscheinlichkeit, dass fast alle Ihre sicheren Verbindungen im Web tatsächlich TLS und nicht SSL verwenden.

TLS verfügt über mehrere Funktionen:

  1. Verschlüsseln Sie die Daten Ihrer Anwendungsschicht. (In Ihrem Fall ist das Protokoll der Anwendungsschicht HTTP.)
  2. Authentifizieren Sie den Server beim Client.
  3. Authentifizieren Sie den Client beim Server.

# 1 und # 2 sind sehr häufig. # 3 ist weniger verbreitet. Sie scheinen sich auf # 2 zu konzentrieren, also werde ich diesen Teil erklären.

Authentifizierung

Ein Server authentifiziert sich bei einem Client mithilfe eines Zertifikats. Ein Zertifikat ist ein Datenblock [1], der Informationen zu einer Website enthält:

  • Domainname
  • Öffentlicher Schlüssel
  • Das Unternehmen, dem es gehört
  • Als es ausgestellt wurde
  • Wenn es abläuft
  • Wer hat es ausgestellt?
  • Etc.

Sie können Vertraulichkeit erreichen (Nr. 1 oben), indem Sie den im Zertifikat enthaltenen öffentlichen Schlüssel verwenden, um Nachrichten zu verschlüsseln, die nur mit dem entsprechenden privaten Schlüssel entschlüsselt werden können, der sicher auf diesem Server gespeichert werden sollte. [2] Nennen wir dieses Schlüsselpaar KP1, damit wir später nicht verwirrt werden. Sie können auch überprüfen, ob der Domainname auf dem Zertifikat mit der Site übereinstimmt, die Sie besuchen (Nr. 2 oben).

Was aber, wenn ein Gegner Pakete ändern kann, die an und vom Server gesendet werden, und wenn dieser Gegner das Ihnen vorgelegte Zertifikat ändert und seinen eigenen öffentlichen Schlüssel einfügt oder andere wichtige Details ändert? In diesem Fall könnte der Gegner alle Nachrichten abfangen und ändern, von denen Sie glaubten, dass sie sicher verschlüsselt sind.

Um genau diesen Angriff zu verhindern, wird das Zertifikat vom privaten Schlüssel eines anderen kryptografisch signiert, sodass die Signatur von jedem überprüft werden kann, der über den entsprechenden öffentlichen Schlüssel verfügt. Nennen wir dieses Schlüsselpaar KP2, um zu verdeutlichen, dass dies nicht dieselben Schlüssel sind, die der Server verwendet.

Zertifizierungsstellen

Wer hat KP2 erstellt? Wer hat das Zertifikat unterschrieben?

Ein bisschen zu stark vereinfachen, eine Zertifizierungsstelle vereinfacht KP2 und verkauft den Dienst, ihren privaten Schlüssel zum Signieren von Zertifikaten für andere Organisationen zu verwenden. Zum Beispiel erstelle ich ein Zertifikat und bezahle eine Firma wie Verisign, um es mit ihrem privaten Schlüssel zu signieren. [3] Da niemand außer Verisign Zugriff auf diesen privaten Schlüssel hat, kann keiner von uns diese Signatur fälschen.

Und wie würde ich persönlich den öffentlichen Schlüssel in KP2 erhalten, um diese Signatur zu überprüfen?

Nun, wir haben bereits gesehen, dass ein Zertifikat einen öffentlichen Schlüssel enthalten kann - und Informatiker lieben die Rekursion - warum also nicht den öffentlichen KP2-Schlüssel in ein Zertifikat einfügen und auf diese Weise verteilen? Das klingt zunächst etwas verrückt, aber genau so funktioniert es. In Fortsetzung des Verisign-Beispiels erstellt Verisign ein Zertifikat, das Informationen darüber enthält, wer sie sind, welche Arten von Dingen sie signieren dürfen (andere Zertifikate) und ihren öffentlichen Schlüssel.

Wenn ich jetzt eine Kopie dieses Verisign-Zertifikats habe, kann ich damit die Signatur auf dem Serverzertifikat für die Website überprüfen, die ich besuchen möchte. Einfach richtig?!

Na ja, nicht so schnell. Ich musste das Verisign-Zertifikat von irgendwoher bekommen . Was ist, wenn jemand das Verisign-Zertifikat fälscht und dort seinen eigenen öffentlichen Schlüssel ablegt? Dann können sie die Signatur auf dem Zertifikat des Servers fälschen, und wir sind wieder da, wo wir angefangen haben: ein Man-in-the-Middle-Angriff.

Zertifikatsketten

Wenn wir weiterhin rekursiv denken, könnten wir natürlich ein drittes Zertifikat und ein drittes Schlüsselpaar (KP3) einführen und damit das Verisign-Zertifikat signieren. Wir nennen dies eine Zertifikatskette: Jedes Zertifikat in der Kette wird verwendet, um das nächste Zertifikat zu überprüfen. Hoffentlich können Sie bereits sehen, dass dieser rekursive Ansatz nur aus Schildkröten / Zertifikaten besteht. Wo hört es auf?

Da wir nicht unendlich viele Zertifikate erstellen können, muss die Zertifikatskette offensichtlich irgendwo anhalten , und dazu wird ein Zertifikat in die Kette aufgenommen, das selbst signiert ist .

Ich werde einen Moment innehalten, während Sie die Stücke von Hirnsubstanz von Ihrem explodierenden Kopf aufheben. Selbstsigniert?!

Ja, am Ende der Zertifikatskette (auch als "Root" bezeichnet) befindet sich ein Zertifikat, das sein eigenes Schlüsselpaar verwendet, um sich selbst zu signieren. Dies beseitigt das Problem der unendlichen Rekursion, behebt jedoch nicht das Authentifizierungsproblem. Jeder kann ein selbstsigniertes Zertifikat erstellen, auf dem etwas steht, genauso wie ich ein gefälschtes Princeton-Diplom erstellen kann, das besagt, dass ich ein dreifaches Hauptfach in Politik, theoretischer Physik und angewandter Arschtritt habe und dann unten meinen eigenen Namen unterschreibe.

Die [etwas nicht aufregende] Lösung für dieses Problem besteht darin, nur einige selbstsignierte Zertifikate auszuwählen, denen Sie ausdrücklich vertrauen. Zum Beispiel könnte ich sagen: "Ich vertraue diesem selbstsignierten Verisign-Zertifikat."

Mit diesem expliziten Vertrauen kann ich jetzt die gesamte Zertifikatskette validieren. Egal wie viele Zertifikate sich in der Kette befinden, ich kann jede Signatur bis zum Stamm validieren. Wenn ich zum Stammverzeichnis komme, kann ich überprüfen, ob dieses Stammzertifikat eines ist, dem ich ausdrücklich vertraue. Wenn ja, dann kann ich der gesamten Kette vertrauen.

Verliehenes Vertrauen

Die Authentifizierung in TLS verwendet ein System des verliehenen Vertrauens . Wenn ich einen Automechaniker einstellen möchte, kann ich keinem zufälligen Mechaniker vertrauen, den ich finde. Aber vielleicht bürgt mein Freund für einen bestimmten Mechaniker. Da ich meinem Freund vertraue, kann ich diesem Mechaniker vertrauen.

Wenn du einen Computer kaufst oder einen Browser herunterlädst, werden einige hundert Stammzertifikate mitgeliefert, denen er ausdrücklich vertraut. [4] Die Unternehmen, die diese Zertifikate besitzen und betreiben, können dieses Vertrauen durch die Unterzeichnung ihrer Zertifikate anderen Organisationen verleihen.

Dies ist alles andere als ein perfektes System. Manchmal stellt eine Zertifizierungsstelle möglicherweise fälschlicherweise ein Zertifikat aus. In diesen Fällen muss das Zertifikat möglicherweise widerrufen werden. Der Widerruf ist schwierig, da das ausgestellte Zertifikat immer kryptografisch korrekt ist. Ein Out-of-Band-Protokoll ist erforderlich, um herauszufinden, welche zuvor gültigen Zertifikate widerrufen wurden. In der Praxis sind einige dieser Protokolle nicht sehr sicher, und viele Browser überprüfen sie sowieso nicht.

Manchmal ist eine gesamte Zertifizierungsstelle gefährdet. Wenn Sie beispielsweise in Verisign einbrechen und den Root-Signaturschlüssel stehlen, können Sie jedes Zertifikat der Welt fälschen . Beachten Sie, dass dies nicht nur Verisign-Kunden betrifft: Auch wenn mein Zertifikat von Thawte (einem Konkurrenten von Verisign) signiert ist, spielt dies keine Rolle. Mein Zertifikat kann weiterhin mit dem kompromittierten Signaturschlüssel von Verisign gefälscht werden.

Das ist nicht nur theoretisch. Es ist in freier Wildbahn passiert. DigiNotar wurde bekanntermaßen gehackt und ging anschließend bankrott. Comodo wurde ebenfalls gehackt , aber unerklärlicherweise bleiben sie bis heute im Geschäft.

Selbst wenn Zertifizierungsstellen nicht direkt gefährdet sind, gibt es in diesem System andere Bedrohungen. Beispielsweise zwingt eine Regierung eine Zertifizierungsstelle zur Unterzeichnung eines gefälschten Zertifikats. Ihr Arbeitgeber kann ein eigenes CA-Zertifikat auf Ihrem Mitarbeitercomputer installieren. In diesen verschiedenen Fällen ist der Datenverkehr, von dem Sie erwarten, dass er "sicher" ist, für die Organisation, die dieses Zertifikat kontrolliert, tatsächlich vollständig sichtbar / änderbar.

Einige Ersetzungen wurden vorgeschlagen, einschließlich Konvergenz , TACK und DANE .

Endnoten

[1] TLS-Zertifikatdaten werden gemäß dem X.509-Standard formatiert . X.509 basiert auf ASN.1 ("Abstract Syntax Notation # 1"), was bedeutet, dass es sich nicht um ein binäres Datenformat handelt. Daher muss X.509 in ein Binärformat codiert werden. DER und PEM sind die beiden häufigsten Codierungen, die ich kenne.

[2] In der Praxis wechselt das Protokoll tatsächlich zu einer symmetrischen Verschlüsselung, aber das ist ein Detail, das für Ihre Frage nicht relevant ist.

[3] Vermutlich überprüft die Zertifizierungsstelle tatsächlich, wer Sie sind, bevor Sie Ihr Zertifikat unterschreiben. Wenn sie das nicht taten, konnte ich einfach ein Zertifikat für google.com erstellen und eine Zertifizierungsstelle bitten, es zu unterschreiben. Mit diesem Zertifikat konnte ich jede "sichere" Verbindung zu google.com in der Mitte managen. Daher ist der Validierungsschritt ein sehr wichtiger Faktor beim Betrieb einer Zertifizierungsstelle. Leider ist nicht sehr klar, wie streng dieser Validierungsprozess bei Hunderten von Zertifizierungsstellen auf der ganzen Welt ist.

[4] Siehe Mozillas Liste vertrauenswürdiger Zertifizierungsstellen .

Mark E. Haase
quelle
Was ist ein privater Schlüssel?
Koray Tugay
Sie haben vergessen zu erwähnen, dass der öffentliche Schlüssel Teil der an die Website gesendeten Zertifikatdatei ist, um die Daten zu entschlüsseln, die Ihr Server zuerst verschlüsselt hat.
Mamdouh Alramadan
Danke @mamdouhalramadan. Ich habe bearbeitet, um das zu erwähnen.
Mark E. Haase
2
@mamdouhalramadan "Der öffentliche Schlüssel wird ... an die Website gesendet, um die Daten zu entschlüsseln". Wie kann der öffentliche Schlüssel zum Entschlüsseln von Daten verwendet werden?
Teddy
@ateddy Du bist richtig. Es kann nicht. Der öffentliche Schlüssel wird nur zur Authentifizierung verwendet. Die Behauptung hier, dass die Schlüsselpaare auch zur Ver- und Entschlüsselung verwendet werden, ist falsch. Dafür wird ein sicher ausgehandelter Sitzungsschlüssel verwendet.
Marquis von Lorne
53

HTTPS ist eine Kombination aus HTTP und SSL (Secure Socket Layer) , um eine verschlüsselte Kommunikation zwischen Client (Browser) und Webserver (Anwendung wird hier gehostet) bereitzustellen.

Warum wird es benötigt?

HTTPS verschlüsselt Daten, die vom Browser über das Netzwerk zum Server übertragen werden. So kann niemand die Daten während der Übertragung schnüffeln.

Wie wird eine HTTPS-Verbindung zwischen Browser und Webserver hergestellt?

  1. Der Browser versucht, eine Verbindung zu https://payment.com herzustellen .
  2. Der server.com-Server sendet ein Zertifikat an den Browser. Dieses Zertifikat enthält den öffentlichen Schlüssel des Zahlungs-Server und einige Hinweise darauf, dass dieser öffentliche Schlüssel tatsächlich zu payment.com gehört.
  3. Der Browser überprüft das Zertifikat, um sicherzustellen, dass es über den richtigen öffentlichen Schlüssel für payment.com verfügt.
  4. Der Browser wählt einen zufälligen neuen symmetrischen Schlüssel K aus, der für die Verbindung mit dem server.com-Server verwendet werden soll. Es verschlüsselt K unter dem öffentlichen Schlüssel von payment.com.
  5. zahlung.com entschlüsselt K mit seinem privaten Schlüssel. Jetzt kennen sowohl der Browser als auch der Zahlungsserver K, aber sonst niemand.
  6. Immer wenn der Browser etwas an payment.com senden möchte, verschlüsselt er es unter K; Der Zahlungs-Server entschlüsselt es nach Erhalt. Immer wenn der Zahlungs-Server etwas an Ihren Browser senden möchte, verschlüsselt er es unter K.

Dieser Fluss kann durch das folgende Diagramm dargestellt werden: Geben Sie hier die Bildbeschreibung ein

sanjay_kv
quelle
1
Der Teil über das Verschlüsseln und Senden des Sitzungsschlüssels und das Entschlüsseln auf dem Server ist vollständig und völliger Müll. Der Sitzungsschlüssel wird niemals übertragen: Er wird über einen sicheren Algorithmus für die Negoatiaon-Schlüssel eingerichtet. Bitte überprüfen Sie Ihre Fakten, bevor Sie solchen Unsinn veröffentlichen. RFC 2246.
Marquis von Lorne
Warum verwendet der Browser den öffentlichen Schlüssel des Servers nicht zum Verschlüsseln von Daten, wenn diese auf dem Server veröffentlicht werden, anstatt in Schritt 4 einen zufälligen neuen symmetrischen Schlüssel K zu erstellen?
KevinBui
1
@ KevinBui Weil das Senden der Antwort vom Server erfordern würde, dass der Client ein Schlüsselpaar hat, und weil die asymmetrische Verschlüsselung sehr langsam ist.
Marquis von Lorne
3

Ich habe einen kleinen Blog-Beitrag geschrieben, in dem der Prozess kurz besprochen wird. Bitte schauen Sie doch mal rein.

SSL-Handshake

Ein kleiner Ausschnitt davon ist wie folgt:

"Der Client stellt über HTTPS eine Anfrage an den Server. Der Server sendet eine Kopie seines SSL-Zertifikats + des öffentlichen Schlüssels. Nachdem er die Identität des Servers mit seinem lokalen vertrauenswürdigen CA-Speicher überprüft hat, generiert der Client einen geheimen Sitzungsschlüssel und verschlüsselt ihn mit dem öffentlichen Server Der Server entschlüsselt den geheimen Sitzungsschlüssel mit seinem privaten Schlüssel und sendet eine Bestätigung an den Client. Sicherer Kanal eingerichtet. "

Abhishek Jain
quelle
"Nach Überprüfung der Identität des Servers mit seinem lokalen vertrauenswürdigen CA-Speicher" - dies ist nicht unbedingt der Fall. Ich kann ein selbstsigniertes Zertifikat verwenden und HTTPS würde funktionieren - ich kann eine sichere HTTPS-Verbindung zu einem Server herstellen . Das vertrauenswürdige Zertifikat kommt nur an, wenn ich sicherstellen möchte, dass ich mit dem richtigen Server spreche .
Teddy
Der Teil über das Verschlüsseln und Senden des Sitzungsschlüssels und das Entschlüsseln auf dem Server ist vollständig und völliger Müll. Der Sitzungsschlüssel wird überhaupt nicht übertragen: Er wird über einen sicheren Algorithmus für die Schlüsselverhandlung eingerichtet. Bitte überprüfen Sie Ihre Fakten, bevor Sie solchen Unsinn veröffentlichen. RFC 2246.
Marquis von Lorne
@ Teddy Das stimmt nicht. Die Überprüfung der Zertifikatsvertrauensstellung ist ein erforderlicher Bestandteil von SSL. Es kann umgangen werden, ist aber normalerweise in Kraft: Selbstsignierte Zertifikate funktionieren nicht ohne besondere Maßnahmen der einen oder anderen Art.
Marquis von Lorne
2

Mehaase hat es bereits ausführlich erklärt. Ich werde meine 2 Cent zu dieser Serie hinzufügen. Ich habe viele Blogposts, die sich mit SSL-Handshake und Zertifikaten befassen. Während sich das meiste davon um den IIS-Webserver dreht, ist der Beitrag für SSL / TLS-Handshake im Allgemeinen immer noch relevant. Hier sind einige als Referenz:

Behandeln Sie CERTIFICATES & SSL nicht als ein Thema. Behandle sie als zwei verschiedene Themen und versuche dann zu sehen, mit wem sie zusammenarbeiten. Dies hilft Ihnen bei der Beantwortung der Frage.

Vertrauensbildung zwischen kommunizierenden Parteien über Certificate Store

Die SSL / TLS-Kommunikation basiert ausschließlich auf Vertrauen. Jeder Computer (Client / Server) im Internet verfügt über eine Liste der von ihm verwalteten Stamm- und Zwischenzertifizierungsstellen. Diese werden regelmäßig aktualisiert. Während des SSL-Handshakes wird dies als Referenz verwendet, um Vertrauen herzustellen. Zum Beispiel während des SSL-Handshakes, wenn der Client dem Server ein Zertifikat zur Verfügung stellt. Der Server versucht zu überprüfen, ob die Zertifizierungsstelle, die das Zertifikat ausgestellt hat, in der Liste der Zertifizierungsstellen vorhanden ist. Wenn dies nicht möglich ist, wird erklärt, dass die Überprüfung der Zertifikatskette nicht möglich war. (Dies ist ein Teil der Antwort. Es geht auch um AIADazu führt der Client eine ähnliche Überprüfung für das Serverzertifikat durch, das er in Server Hello empfängt. Unter Windows können Sie die Zertifikatspeicher für Client und Server über PowerShell anzeigen. Führen Sie die folgenden Schritte über eine PowerShell-Konsole aus.

PS Cert:> ls Speicherort: CurrentUser StoreNames: {TrustedPublisher, ClientAuthIssuer, Root, UserDS ...}

Speicherort: LocalMachine StoreNames: {TrustedPublisher, ClientAuthIssuer, Remotedesktop, Root ...}

Browser wie Firefox und Opera verlassen sich bei der Zertifikatverwaltung nicht auf das zugrunde liegende Betriebssystem. Sie unterhalten ihre eigenen separaten Zertifikatspeicher.

Der SSL-Handshake verwendet sowohl symmetrische als auch Public Key-Kryptografie. Die Serverauthentifizierung erfolgt standardmäßig. Die Clientauthentifizierung ist optional und hängt davon ab, ob der Serverendpunkt für die Authentifizierung des Clients konfiguriert ist oder nicht. Verweisen Sie auf meinen Blog-Beitrag, da ich dies ausführlich erklärt habe.

Endlich zu dieser Frage

Wie erkennt das HTTPS-Protokoll das Zertifikat? Warum kann HTTP nicht mit Zertifikaten arbeiten, wenn es die Zertifikate sind, die die gesamte Vertrauens- / Verschlüsselungs- / Authentifizierungsarbeit ausführen?

Zertifikate sind einfach Dateien, deren Format durch den X.509- Standard definiert ist . Es ist ein elektronisches Dokument, das die Identität einer kommunizierenden Partei beweist. HTTPS = HTTP + SSL ist ein Protokoll, das die Richtlinien definiert, wie zwei Parteien miteinander kommunizieren sollen.

MEHR INFORMATIONEN

  • Um Zertifikate zu verstehen, müssen Sie verstehen, was Zertifikate sind, und auch Informationen zur Zertifikatsverwaltung lesen. Das ist wichtig.
  • Sobald dies verstanden ist, fahren Sie mit dem TLS / SSL-Handshake fort. Sie können die RFCs dafür verweisen. Aber sie sind ein Skelett, das die Richtlinien definiert. Es gibt mehrere Blogposts, einschließlich meiner, die dies ausführlich erklären.

Wenn die oben genannte Aktivität ausgeführt wird, haben Sie ein angemessenes Verständnis für Zertifikate und SSL.

Kaushal Kumar Panday
quelle