Im vorherigen Modul
haben wir über die Benutzerauthentifizierung in vielen Details gesehen.
Wir hatten gesehen, wie der Benutzer seine Anmeldeinformationen von der Client-Seite
entweder im Header
seiner Anforderungsnachricht oder im Text der Anforderungsnachricht an
seinen Server sendet und dann, wenn sie authentifiziert werden, dann wird sein Client entweder das Cookie oder das
Token in der Header der Anforderungsnachricht, die vom Client zum Server geht.
Ich bin sicher, dass einige von Ihnen über
die Tatsache, dass wir über einen unsicheren Kanal kommunizieren,
was bedeutet, dass jeder, der in der Mitte sitzt, der
seine Nachrichten hören kann, die zwischen dem Client
und dem Server gehen, leicht in der Lage sein würde,
die Anmeldeinformationen zu erfassen und dann den echten Kunden ausgeben.
Natürlich
lag ihr Schwerpunkt zu diesem Zeitpunkt eher auf der Anordnung der Client- und
Server-Kommunikation mit der Authentifizierung des Clients auf der Serverseite.
Aber jedes Mal, wenn Sie
die Benutzerauthentifizierung verwenden müssen, zuerst in Form von, sagen wir,
die Anmeldeinformationen angeben, um sich selbst zu
authentifizieren und danach, indem Sie entweder das Cookie oder das
Token in den Header der Anforderungsnachricht einschließen,
sollten Sie dies über eine sicherer Kanal.
Sie sollten niemals über einen unsicheren Kanal kommunizieren,
was bedeutet, dass Sie HTTP nicht verwenden sollten und
diese Anmeldeinformationen dann entweder in den Header oder den Text der Anforderungsnachrichten aufnehmen sollten.
Stattdessen sollten Sie eine sichere Version des HTTP-Protokolls oder des HTTPS verwenden.
Lassen Sie uns kurz über HTTPS in dieser Vorlesung sprechen.
Auf dem Weg werde ich Ihnen eine fünfminütige Einführung in Kryptographie und Sicherheit geben.
Offensichtlich ist Kryptographie und Sicherheit ein sehr großes Thema für sich.
Ich werde Ihnen nur das Wesentliche vorstellen, das Sie
verstehen müssen, um zu lernen, wie HTTPS tatsächlich funktioniert.
Vor diesem Hintergrund gehen wir über Kryptografie und dann auf
das HTTPS-Protokoll zu verstehen und wie Sie einen Server konfigurieren würden, um
das HTTPS-Protokoll zu verwenden und dann den Client, um den Server über das HTTPS-Protokoll zu kontaktieren
, wodurch die Kommunikation zwischen dem Client und dem Server kann auf sichere Weise,
indem die zwischen dem Client und der Serverseite gesendeten Daten verschlüsselt werden.
Wenn Sie sich in den Bereichen Kryptografie und Sicherheit wagen,
hören Sie oft Leute, die über symmetrische Schlüsselkryptografie sprechen.
Was beinhaltet Kryptographie?
Wenn Sie eine Nachricht über einen Kanal an einen anderen Benutzer senden müssen,
dann möchten Sie in der Lage sein, die Nachricht
so zu verschlüsseln, dass nur der Empfänger in der Lage ist,
die Nachricht zu entschlüsseln und
die Informationen zu erhalten, die Sie an den Empfänger senden möchten.
So sollten sowohl der Sender als auch der Empfänger zwischen den beiden verstehen,
wie dieser Verschlüsselungsprozess und wie die Entschlüsselung funktionieren wird.
Damit dies funktioniert, funktioniert
jede Verschlüsselung und Entschlüsselung basierend auf dem Austausch von geheimen Schlüsseln.
In der symmetrischen Schlüsselkryptografie
teilen sich sowohl der Sender als auch der Empfänger einen geheimen Schlüssel zwischen den beiden Seiten,
und dieser geheime Schlüssel ist nur dem Absender und der Empfängerseite bekannt.
Wenn also der Absender die Nachricht senden muss,
verschlüsselt der Absender diese Nachricht mit einem Kryptografiealgorithmus,
der den geheimen Schlüssel als die andere Eingabe für diesen Algorithmus verwendet.
Und sobald diese Nachricht durch diesen Kryptografie-Algorithmus übergeben
wird, wird eine verschlüsselte Nachricht generiert.
Nun wird diese verschlüsselte Nachricht an den Kanal über die Empfängerseite gesendet.
Wenn ein böswilliger Drittanbieter
zwischendurch sitzt und diese verschlüsselte Nachricht abhört und erfasst,
wäre es schwierig,
diese Nachricht zu entschlüsseln, da
Sie für die Entschlüsselung einer verschlüsselten Nachricht immer noch den geheimen Schlüssel benötigen.
Nun, auf der Empfängerseite,
wenn die verschlüsselte Nachricht empfangen wird,
dann wird der Empfänger angewendet und ein Entschlüsselungsalgorithmus
, der auch als Eingabe den
gleichen geheimen Schlüssel nimmt, der auf der Senderseite verwendet wurde, um die Nachricht zu verschlüsseln.
So wird bei der Entschlüsselung die ursprüngliche Nachricht abgerufen
und kann auf der Empfängerseite verarbeitet werden.
Nun, wenn ein böswilliger Dritter diese verschlüsselte Nachricht entschlüsseln möchte,
werden sie sich einer ansteigenden Schlacht stellen, weil
der Prozess der Verschlüsselung mit dem geheimen Schlüssel die Nachricht umdreht und
die Nachricht wiederum verschlüsseln kann.
Ohne den geheimen Schlüssel
zu besitzen, wird es fast unmöglich sein, die verschlüsselte Nachricht zu entschlüsseln.
Nun, das ist Stretching ein bisschen weit zu bekommen.
Es wäre übermäßig schwierig, die verschlüsselte Nachricht zu entschlüsseln.
Wenn Sie Brute-Force-Techniken verwenden,
werden Sie schließlich die verschlüsselte Nachricht entschlüsseln.
Aber es wird so lange dauern und so viel Rechenleistung erfordern.
Es lohnt sich nicht, den
böswilligen Drittanbieter-Benutzer zu versuchen, die verschlüsselte Nachricht zu entschlüsseln.
Also machen Sie es im Wesentlichen schwierig für jemanden,
die Nachricht zu entschlüsseln, wenn sie nicht den geheimen Schlüssel besitzen.
Da nun der geheime Schlüssel nur dem Sender und dem Empfänger bekannt ist,
können die beiden Endparteien, der Sender und der Empfänger, mit der Sicherheit kommunizieren,
dass in verschlüsselter Nachricht von
der Senderseite nur von der Empfängerseite entschlüsselt werden kann.
So funktioniert die symmetrische Schlüsselkryptographie.
Die Tatsache, dass Sie den gleichen geheimen Schlüssel haben,
der zwischen dem Sender und dem Empfänger geteilt wird, bedeutet, dass
die Aufnahme des Entschlüsselungsprozesses den gleichen geheimen Schlüssel verwendet
, daher symmetrische Schlüsselkryptografie.
Natürlich ist bei der symmetrischen Schlüsselkryptografie
eines der Probleme, dass sowohl der Sender als auch
der Empfänger Zugriff auf denselben geheimen Schlüssel haben müssen.
Nun, wenn Sender und Empfänger über einen unsicheren Kanal kommunizieren,
wird es für beide Seiten schwierig sein, zu einem Verständnis
über denselben geheimen Schlüssel zu kommen, ohne ihn anderen zu offenbaren.
Dies ist also, wo ein anderer Algorithmus namens Public-Key-Kryptografie sehr nützlich ist.
Wie funktioniert Public-Key-Kryptografie?
Nun, in der Public-Key-Kryptografie,
ist die Idee, dass Sie zwei verschiedene Schlüssel haben.
Sie haben einen öffentlichen Schlüssel und einen privaten Schlüssel.
Nun kann der öffentliche Schlüssel an jeden, den Sie wollen, weit verbreitet werden.
Wenn also jemand eine Nachricht an Sie senden möchte,
wird er Ihren öffentlichen Schlüssel verwenden, um die Nachricht zu verschlüsseln.
Wenn also ein Absender hier die Nachricht an den Empfänger senden möchte,
verwendet der Absender den öffentlichen Schlüssel vom Empfänger, um die
Nachricht auf der Senderseite mit dem Verschlüsselungsalgorithmus zu verschlüsseln.
Sobald die verschlüsselte Nachricht
über den unsicheren Kanal an die Empfängerseite gesendet
wird, verwendet der Empfänger dann den privaten Schlüssel
, den nur der Empfänger kennt, um zu entschlüsseln.
Damit die Kryptografie mit öffentlichen Schlüsseln funktioniert, wie wir gesehen haben,
kann der öffentliche Schlüssel ohne Bedenken weit verbreitet werden.
Da der private Schlüssel jedoch nur der Empfängerseite bekannt ist,
kann nur der Empfänger die Nachricht entschlüsseln, und
wieder ein Drittanbieter-Eindringling, der
diese verschlüsselte Nachricht erfasst, wird es unordentlich schwierig finden, die Nachricht zu entschlüsseln.
Nun, natürlich in der Public-Key-Kryptografie,
der öffentliche und der private Schlüssel sind zwei verschiedene Schlüssel.
Nun, dann wäre Ihre offensichtliche nächste Frage, warum
nicht einfach Public-Key-Kryptografie für die Verschlüsselung verwenden.
Das Problem ist, dass die Verwendung von
Public-Key-Kryptografie für Verschlüsselung und Entschlüsselung ein teurer Prozess
ist, und deshalb verwenden wir keine Public-Key-Kryptografie für ihre gesamte Kommunikation.
Stattdessen wird die Public-Key-Kryptografie
hauptsächlich für den Sender und den Empfänger verwendet werden, um sich
auf den gemeinsamen geheimen Schlüssel zu einigen, den die beiden verwenden werden.
Wir werden später sehen, wie die Public-Key-Kryptografie
verwendet werden kann, um den gemeinsamen geheimen Schlüssel
zwischen dem Sender und dem Empfänger zu etablieren und anschließend
symmetrische Schlüsselkryptographie für die weitere Kommunikation zu verwenden.
Ein Protokoll, das diesen Ansatz verwendet, ist die Secure Sockets
Layer und auch die Transport Layer Sicherheitsprotokolle,
SSL und TLS kurz.
So oft, wenn Sie die Dokumentation lesen,
hören Sie vielleicht etwas über SSL und TLS.
Diese Kryptografieprotokolle ermöglichen eine sichere Kommunikation zwischen
Sender und Empfänger über ein unsicheres Netzwerk wie das Internet.
Der Sender und der Empfänger kommunizieren über dieses Internet mit verschlüsselten Nachrichten,
die nur der Absender und der Empfänger entschlüsseln können.
Und dieser Ansatz, entweder das SSL oder TLS,
verwendet eine Kombination aus Public-Key-Kryptografie zusammen mit symmetrischer Schlüsselkryptografie.
Ihren genauen Prozess, dies zu tun,
werde ich in der nächsten Folie erklären.
Darüber hinaus
versuchen wir mit SSL oder TLS, zwei verschiedene Dinge zu pflegen.
Wir versuchen zunächst, die Privatsphäre der
Kommunikation zwischen dem Absender und dem Empfänger zu wahren, so dass
kein böswilliger Dritter die Nachricht aus der verschlüsselten Nachricht extrahieren kann.
Zweitens versuchen wir auch, die Integrität aufrechtzuerhalten,
was bedeutet, dass
der Empfänger beim Senden einer Nachricht sicher sein kann, dass die Nachricht nicht manipuliert wurde.
Daher ist in diesem Fall sowohl die Sicherheit als auch die Aufrechterhaltung der Integrität sehr wichtig.
Daher müssen sowohl Privatsphäre als auch Integrität durch
dieses sichere Kommunikationsprotokoll aufrechterhalten werden, das wir
für den Austausch zwischen Sender und Empfänger erstellen.
Lassen Sie uns kurz darüber sprechen, wie SSL oder TLS tatsächlich funktionieren.
Dies geschieht durch einen Handshaking-Prozess, den ich hier in diesem Diagramm veranschaulicht habe.
Wenn ein Client mit dem Server kommunizieren möchte,
sendet der Client eine Nachricht an den Server, in der
angegeben wird, dass der Client sicher mit dem Server kommunizieren möchte.
Zu diesem Zeitpunkt sendet der Server das Zertifikat an den Client zurück
, der einen öffentlichen Schlüssel
enthält,
der von der Zertifizierungsstelle als zu diesem bestimmten Server gehört.
Auf diese Weise kann der Client, wenn der Client
diesen öffentlichen Schlüssel und die Zertifizierung durch
die Zertifizierungsstelle erhält, die Anmeldeinformationen des Servers überprüfen.
Der Client muss also feststellen, dass er wirklich mit dem Server spricht,
mit dem er kommunizieren will.
An diesem Punkt,
wenn der Client die Anmeldeinformationen des Servers überprüft,
hat der Client nun Zugriff auf den öffentlichen Schlüssel des Servers.
Sobald der Client den öffentlichen Schlüssel des Servers erhält,
generiert der Client das, was als Pre-Master-Geheimnis bezeichnet wird.
Dieses Pre-Master-Geheimnis ist etwas, das sowohl der Client
als auch der Server verwenden, um einen sogenannten Sitzungsschlüssel zu generieren.
So generiert der Client ein Pre-Master-Geheimnis,
der Client verschlüsselt dann dieses Geheimnis mit dem öffentlichen Schlüssel des Servers
und sendet dann das Geheimnis an den Server.
Denken Sie nun daran, dass, sobald das Geheimnis mit dem öffentlichen Schlüssel verschlüsselt wurde,
niemand außer dem Server in der Lage ist,
die Informationen aus der verschlüsselten Nachricht zu extrahieren.
Wenn der Server diese verschlüsselte Nachricht erhält,
extrahiert der Server das Pre-Master-Geheimnis aus dieser Nachricht.
Jetzt verfügen sowohl der Client als auch der Server über das gleiche Pre-Master-Geheimnis.
An diesem Punkt verwenden sowohl der Client als auch der Server
den gleichen Satz von Schritten, beginnend mit dem Geheimnis des Pre-Masters
und mit dem gleichen Satz von Werten,
die einen Schlüssel generieren, der als Sitzungsschlüssel bezeichnet wird.
Wenn nun der Sitzungsschlüssel sowohl auf der Client- als auch auf der Serverseite generiert
wird, ist er genau der gleiche Sitzungsschlüssel,
da beide genau dem gleichen Prozess zum Generieren des Sitzungsschlüssels folgen.
An dieser Stelle
verfügen sowohl der Client als auch der Server nun über einen geheimen Schlüssel, der auf beiden Seiten gleich ist.
So
kann die gesamte nachfolgende Kommunikation zwischen dem Server und dem Client, dann mit symmetrischer Verschlüsselung fortfahren.
Wenn der Client also mit dem Server kommunizieren muss,
verschlüsselt der Client die Daten mit dem geheimen Sitzungsschlüssel
und sendet dann seine Daten.
Wenn der Server mit dem Client kommunizieren muss,
verwendet der Server offensichtlich
denselben Sitzungsschlüssel, um die Daten zu verschlüsseln und dann an den Client zu senden.
Da der Client nun denselben Sitzungsschlüssel besitzt,
kann der Client die Nachricht entschlüsseln und die unverschlüsselte Nachricht extrahieren.
Mit diesem Verfahren haben
der Client und der Server sichergestellt, dass die Kommunikation zwischen ihnen privat ist.
Außerdem können wir sicherstellen, dass kein böswilliger Dritter
die Nachricht abfangen und Änderungen an der Nachricht verursachen kann.
Daher wird auch die Integrität der Nachricht beibehalten,
und die Privatsphäre der Kommunikation zwischen
dem Client und dem Server wird ebenfalls beibehalten.
Also, diese ganze Diskussion, die ich Ihnen auf den letzten Folien vorgestellt habe,
ist auf den Punkt gebracht,
wie sichere Kommunikation zwischen Client und Server durch die
symmetrische Schlüsselkryptographie und Public Key-Kryptographie gewährleistet werden kann.
Nun, offensichtlich gibt es viel mehr als das, was ich hier erklärt habe,
aber dieses Verständnis dafür, wie Kryptographie funktioniert,
reicht aus, um zu verstehen, wie der gesamte Prozess funktioniert.
Nun, wenn Sie daran interessiert sind, mehr darüber zu erfahren,
ist eine gute Quelle für das Lernen von Kryptographie-Protokollen ein sehr gutes Buch
von Jim Crozon Keith Ross namens Computer Networks.
Dieses Buch hat ein sehr leicht zu verstehendes Kapitel
über Kryptographie und Sicherheit, wie es auf die Netzwerkkommunikation angewendet wird.
Nun, da wir den Prozess
für die sichere Kommunikation zwischen einem Client und Server etabliert haben,
schauen wir uns an, wie das Internet selbst dies
für die Kommunikation zwischen einem Client und dem Server über HTTP nutzt.
Nun, hier kommt das HTTPS-Protokoll ins Bild.
Wie Sie bereits über das Internet wissen,
ist das Internet eine mehrschichtige Architektur,
bei der die IP und das TCP das Netzwerk bilden,
und die Transportschicht, die über dem zugrunde liegenden Netzwerk läuft.
Nun
haben Sie auf der Transportschicht die Secure Socket Layer oder die Transportschicht-Sicherheits-Auskleidung als
dünne Schicht auf TCP, die eine
sichere Kommunikation zwischen dem Client und dem Server gewährleistet.
Und darüber hinaus kann HTTP laufen.
Daher beinhaltet HTTP im Wesentlichen HTTP plus die Verwendung von Verschlüsselung,
Entschlüsselung unterstützt durch SSL und TLS.
Offensichtlich
gibt es auch für das HTTPS-Protokoll viel mehr Details.
Aber aus der Perspektive der Implementierung der Serverseite
ist das, was wir hier verstanden haben, ausreichend, um zu verstehen, wie
ein Server konfiguriert werden kann, um eine sichere Kommunikation zwischen dem Client und dem Server zu nutzen.
Nun, natürlich ist die erste Frage, die Ihnen in den Sinn kommen wird,
dass der Server einen öffentlichen Schlüssel und einen privaten Schlüssel benötigt.
Wie generiert der Server dies für eine Kryptografie mit öffentlichen Schlüsseln?
Wenn Sie einen echten Produktionsserver in
Ihrer Umgebung betreiben und den Benutzern einen Service für den Zugriff auf Ihren Server bereitstellen,
müssen Sie natürlich den Zertifizierungsprozess durchlaufen.
Hier wenden Sie sich an eine Zertifizierungsstelle, zum Beispiel an
Unternehmen wie VeriSign und Thawte Corporation
, die öffentliche Zertifizierungsstellen sind.
Es gibt noch ein paar mehr auf der ganzen Welt.
Sie werden sich also an sie wenden,
und diese Zertifizierungsstellen authentifizieren dann Ihre Anmeldeinformationen,
sie stellen sicher, dass Sie der sind, der Sie angeblich sind,
und dann werden sie Ihre Anmeldeinformationen überprüfen
, und dann
werden sie Ihnen einen öffentlichen Schlüssel und einen privaten Schlüssel zur Verwendung ausgeben auf Ihrer Server-Site.
Sobald sie also den öffentlichen Schlüssel und den privaten Schlüssel ausstellen,
wird der öffentliche Schlüssel von der Zertifizierungsstelle zertifiziert,
und dann wird der öffentliche Schlüssel auch
das Zertifikat tragen.
Dies ist also das Zertifikat, das Sie an den Standort des Clients senden.
Da Clients
die Authentizität dieser Zertifizierungsstellen feststellen können,
würden Sie bei einem Browser feststellen, dass die meisten Browser
die Zertifikate für all diese etablierten Zertifizierungsstellen
bereits in sie integriert haben.
So werden sie in der Lage sein, Ihre Anmeldeinformationen zu etablieren
, oder besser gesagt, sie werden in der Lage sein, festzustellen, dass der private Schlüssel zu Ihnen gehört,
indem sie Ihr Zertifikat erhalten und dann
Ihr Zertifikat überprüfen oder verifizieren, in dem Wissen, dass es
von einer dieser etablierten Zertifizierung signiert wurde Die Behörden.
Bei diesem Prozess wird der Kunde in der Lage sein, Ihre Authentizität zu etablieren.
Nun, in diesem Kurs
wollen wir nur verstehen, wie jedes HTTPS funktioniert,
und wollen auch eine einfache Möglichkeit haben,
den Server mit einem öffentlichen Schlüssel und dem privaten Schlüssel einzurichten.
Da wir dies als Übung zum Verständnis von HTTPS tun,
können wir ein Tool namens Open SSL verwenden, das bereits auf
unseren Computern verfügbar ist, um das so genannte selbstsignierte Zertifikat zu generieren.
Selbstsignierte Schlüssel sind in der Außenarbeit nicht akzeptabel.
Aber da wir wissen, dass wir es nur für unsere Testzwecke
verwenden, können wir selbstsignierte Zertifikate verwenden, um
einfach den Prozess
der sicheren Kommunikation zwischen Client und Server zu verstehen.
Also, wie verwenden wir Open SSL?
Bisher können Sie mit Open SSL Keys generieren,
indem Sie drei Befehle verwenden, die ich Ihnen hier zeige.
Sie führen diese drei Befehle in dieser Reihenfolge aus,
wie hier angegeben, und das wird Ihnen helfen,
einen privaten Schlüssel und ein Zertifikat zu generieren, das Sie von
Ihrem HTTPS-Server zur Verfügung stellen können, damit Clients herunterladen und
damit Ihren öffentlichen Schlüssel für eine sichere Kommunikation erhalten.
Dies ist also die Operation, die wir in unserer Übung tun werden, die
diesen Vortrag folgt, um DPS Service zu etablieren und auszugeben. Also die drei Schritte, die wir tun, ist
, erstens, werden wir den privaten Schlüssel mit dem ersten Befehl zu generieren.
Danach werden wir eine cert.csr generieren, die dann
für uns verwendet wird, um ein Zertifikat zu generieren, das
durch den dritten Befehl auf der Client-Seite verteilt werden kann.
Mit diesen Schritten können Sie also einen privaten Schlüssel und
auch ein entsprechendes Zertifikat generieren, das an den Client ausgestellt werden kann.
Um hervorzuheben, dass Sie, wenn Sie einen Produktionsserver ausführen,
einen öffentlichen Schlüssel, ein privates Schlüsselpaar,
von einer der Zertifizierungsstellen wie VeriSign und Thawte Corporation beziehen müssen.
Wie funktioniert der Knoten selbst, um uns beim Einrichten des HTTPS zu helfen?
Jetzt überprüfe ich kurz den Code, den wir
in der folgenden Übung verwenden werden, um unsere Server einzurichten.
Knoten selbst hat das HTTPS als Kernmodul innerhalb des Knotens.
So werden wir HTTPS einrichten, indem wir dieses Kernmodul benötigen.
Wir werden auch das Dateisystem-Kernmodul verwenden, da
der private Schlüssel und das Zertifikat, das wir generieren, auf unserer Serverseite gespeichert
werden und diese von
Ihrer Express-Anwendung benötigt werden, um Ihren sicheren Server einzurichten.
Also hier werden wir das Dateisystem mit
der ReadFileSync-Methode verwenden, um den privaten Schlüssel
und das Zertifikat aus den Dateien zu lesen, die wir
mit den Schritten erzeugen, die wir im vorherigen Slot gesehen haben.
Sobald diese beiden Werte bereit sind, werden
die Optionen für Ihren HTTPS-Server eingerichtet, und Sie können dann
Ihren sicheren Server so konfigurieren, dass HTTPS-basierte Kommunikation von der Server-Site aus bereitgestellt wird.
Jetzt haben Sie ein schnelles Verständnis dafür, wie Ihr HTTPS funktioniert
und wie es die Verwendung von Public Key-Kryptografie
und symmetrischer Schlüsselkryptografie nutzt,
um eine sichere Kommunikation zwischen dem Client und dem Server zu gewährleisten.
Lassen Sie uns auf die Übung gehen, um tatsächlich
unseren Express-Server zu konfigurieren, den wir bisher erstellt haben, um das HTTPS-Protokoll zu verwenden.