TLS/SSL in Python implementieren
Kingsley Ubah
16. Oktober 2022
0 Min. LesezeitHeutzutage erledigen wir praktisch alles online: Wir buchen Flüge, bezahlen Waren, überweisen Geld, schreiben Freunden Nachrichten, speichern Dokumente und vieles mehr. Für viele dieser Aktivitäten müssen wir sensible Informationen wie Kreditkartendaten und Bankinformationen preisgeben. Nutzt eine Website ein ungesichertes Netzwerk, kann ein böswilliger Hacker Nutzerdaten leicht stehlen. Deshalb ist Verschlüsselung so wichtig.
Das Transport Layer Security-Protokoll (TLS) ist der ultimative Schutz für Nutzerdaten auf Websites und in Webanwendungen. TLS verwendet einen schwer zu knackenden kryptografischen Algorithmus, der sicherstellt, dass ausschließlich der Webserver und der Webclient übertragene Daten lesen oder ändern können.
In diesem Artikel erfahren Sie, was TLS ist und wie Sie mit Python die Gültigkeit des TLS-Zertifikats einer Website überprüfen. Anschließend zeigen wir Ihnen Schritt für Schritt, wie Sie TLS zu Ihrer Python-Anwendung unter Linux hinzufügen.
TLS/SSL verstehen
Das TLS-Protokoll, der Nachfolger des Secure Socket Layer-Protokolls (SSL), schützt Daten durch Verschlüsselung. Wenn Nutzer ihre Informationen an eine Website senden, verschlüsselt TLS sie vor der Übertragung. Anschließend kann nur der Server mit dem passenden öffentlichen Schlüssel des Clients die Nachricht öffnen. Diese Regel gilt auch, wenn der Server Informationen an den Client zurücksendet. Nur der Client mit dem entsprechenden Schlüssel kann die Daten lesen.
Damit eine Website das TLS-Protokoll verwenden kann, müssen Sie ein gültiges TLS/SSL-Zertifikat installieren (häufig SSL-Zertifikat genannt). Durch die Installation des Zertifikats wird aus HTTP das sicherere Übertragungsprotokoll HTTPS. Das Zertifikat ist eine Datendatei, die die Identität der Website und den öffentlichen Schlüssel zum Öffnen von Nutzdaten enthält.
Ein SSL-Zertifikat muss gültig sein, damit es funktioniert. Das bedeutet, dass es nicht nur von einer vertrauenswürdigen Zertifizierungsstelle (CA) signiert sein muss, sondern auch noch aktiv sein muss. Jedes Zertifikat hat ein Ausstellungs- und ein Ablaufdatum. Nach dem Ablaufdatum ist ein Zertifikat nicht mehr gültig.
Websites ohne gültiges SSL-Zertifikat lassen sich an wenigen sichtbaren Merkmalen erkennen. Zum einen beginnt die URL in der Adressleiste mit HTTP:// statt mit HTTPS://. Außerdem wird neben der URL kein Schloss-Symbol angezeigt, mit dem Browser eine sichere Website kennzeichnen. Seien Sie vorsichtig mit Ihren Angaben, wenn Sie eines dieser Anzeichen bemerken.
Nachdem wir TLS-over-SSL (TLS/SSL) betrachtet haben, erfahren Sie nun, wie Sie es mit Python implementieren.
Mit TLS/SSL in Python arbeiten
Wenn Sie einen Webserver mit Python erstellen, ist es entscheidend zu wissen, wie Sie TLS/SSL zu Ihrer Anwendung hinzufügen. Bevor wir uns damit befassen, sehen wir uns an, wie Sie mit Python die Gültigkeit des SSL-Zertifikats einer Website überprüfen.
Prüfen, ob eine Website ein gültiges SSL-Zertifikat hat
Wenn Sie die Gültigkeit des SSL-Zertifikats einer Website überprüfen möchten, können Sie dazu einfach ein Python-Skript wie dieses ausführen:
Der obige Code importiert das Python-Modul requests und verwendet es, um eine GET-Anfrage an die Twitter-Website zu senden. (Damit das Skript ausgeführt werden kann, müssen Sie das Modul requests mit pip in Python installieren.) Sie können die Twitter-URL durch die URL der Website ersetzen, deren SSL-Zertifikat Sie überprüfen möchten. Die Variable response speichert den empfangenen Wert, den der Code in der letzten Zeile ausgibt.
Bei der Ausführung des Codes erhalten wir die Meldung <Response [200]> (OK). Das bedeutet, dass die Twitter-Website ein gültiges SSL-Zertifikat verwendet (wie erwartet).
Nun senden wir eine GET-Anfrage an eine andere Website. Dieses Mal verwenden wir eine Website, von der wir wissen, dass sie kein gültiges SSL-Zertifikat hat.
Dieses Mal erhalten wir eine Fehlermeldung, dass die Zertifikatsprüfung fehlgeschlagen ist:
Die Python-SSL-Bibliothek
Mit der Python-SSL-Bibliothek stellen wir TLS-Verschlüsselung für die socketbasierte Kommunikation zwischen Python-Clients und -Servern bereit. Sie verwendet Kryptografie und Message Digests, um Daten zu schützen und Manipulationsversuche im Netzwerk zu erkennen. Digitale Zertifikate dienen der Authentifizierung.
Die SSL-Bibliothek unterstützt Windows, macOS und andere moderne UNIX-Systeme. Außerdem setzt sie OpenSSL voraus.
Gegen Ende dieses Artikels verwenden wir die Python-SSL-Bibliothek, um unseren verbindungsbasierten Socket mit dem SSL-Zertifikat zu umschließen, das wir im nächsten Abschnitt erstellen.
Ein selbstsigniertes SSL-Zertifikat in Python erstellen
Nachdem wir nun wissen, wie Sie die Gültigkeit von TLS/SSL auf einer Website überprüfen, sehen wir uns an, wie Sie es auf einem Python-Webserver einsetzen können.
Für die lokale Entwicklung können Sie schnell ein kostenloses, selbstsigniertes Zertifikat erstellen und verwenden. Wenn Sie die Website oder App jedoch im Internet bereitstellen möchten, müssen Sie ein SSL-Zertifikat bei einem vertrauenswürdigen Domain-Registrar (wie GoDaddy oder NameCheap) erwerben.
Um selbst ein SSL-Zertifikat für unsere lokale Python-Anwendung zu erstellen, sind drei Schritte erforderlich:
Erstellen Sie den privaten RSA-Schlüssel.
Erstellen Sie mit dem privaten Schlüssel eine Zertifikatsignierungsanforderung (CSR).
Signieren Sie die CSR-Anforderung, um das Zertifikat zu erstellen.
Nach der Erstellung des SSL-Zertifikats verwenden wir es in einer Python-Anwendung, wenn wir API-Anfragen senden.
Kaufen Sie ein SSL-Zertifikat grundsätzlich nur bei einer autorisierten Zertifizierungsstelle. Viele Domain-Registrare bieten ein kostenloses SSL-Zertifikat an, wenn Sie bei ihnen eine Domain erwerben.
Los geht’s!
Voraussetzung: OpenSSL unter Linux installieren
Unter Linux ist OpenSSL wahrscheinlich bereits auf Ihrem Computer installiert. Falls nicht, können Sie es über Ihren Paketmanager installieren. Mit dem folgenden Befehl installieren Sie OpenSSL auf Debian- und Ubuntu-basierten Distributionen:
Wenn Sie nicht sicher sind, ob OpenSSL bereits auf Ihrem Computer installiert ist, können Sie dies mit dem folgenden Befehl überprüfen:
Falls OpenSSL installiert ist, wird die Versionsnummer angezeigt. Erhalten Sie nach Ausführung des Befehls hingegen eine Fehlermeldung, dass der Befehl nicht erkannt wurde, müssen Sie OpenSSL installieren.
Den privaten Schlüssel erstellen
Sie können den privaten Schlüssel mit oder ohne schützende Passphrase erstellen. Um eine Passphrase hinzuzufügen, verwenden Sie im Befehl einfach eine Chiffre, zum Beispiel -aes256.
Beide der folgenden Optionen erstellen einen 2048-Bit-RSA-Privatschlüssel. Bei der ersten Option wird der Schlüssel jedoch ohne Passphrase erzeugt.
Die CSR mit dem Schlüssel erstellen
In diesem Schritt verwenden wir den im vorherigen Schritt erstellten privaten Schlüssel, um eine CSR zu generieren. Führen Sie dazu den folgenden Befehl aus:
Geben Sie in der Befehlszeile einige zusätzliche Informationen zum Zertifikat ein. Drücken Sie anschließend Enter.
Das Zertifikat mit dem Schlüssel signieren
Im letzten Schritt signieren Sie die Anforderung, um das Zertifikat zu erstellen. Führen Sie den folgenden Befehl aus:
Hier signieren wir die Zertifikatsanforderung mit demselben Schlüssel, mit dem wir sie erstellt haben. Daher wird dieses Zertifikat als „selbstsigniert“ bezeichnet.
Mit dem folgenden Befehl können Sie die Zertifikatsdetails anzeigen:
Einen Python-HTTPS-Server mit TLS/SSL betreiben
Nachdem wir erfolgreich ein selbstsigniertes Zertifikat erstellt haben, verwenden wir es, um einen HTTPS-Server einzurichten, der die gesamte Kommunikation mit einem Client per TLS verschlüsselt.
Das folgende Python-Programm startet einen HTTPS-Server auf Ihrem lokalen Host am Port 443.
Im obigen Code haben wir die Module ssl und http.server modules importiert. Anschließend haben wir die Methode HTTPServer auf http.server aufgerufen und dabei die Adresse und die Portnummer des Servers übergeben. Danach haben wir den Socket per SSL umschlossen, indem wir in der Methode wrap_socket den Pfad zu unserem Zertifikat angegeben haben. Zum Schluss haben wir den Server am Ende der Datei gestartet.
Um einen Client zu verbinden, können Sie mit dem Python-Modul requests eine GET-Anfrage an die Serveradresse senden:
Beachten Sie, dass der obige Code in einer anderen Datei als der Servercode stehen muss. Bei der Ausführung sollte der Client eine Verbindung zum Server herstellen und die Meldung [200] (OK) zurückgeben:
Zusammenfassung
In diesem Artikel haben wir TLS/SSL und die Bedeutung eines gültigen digitalen Zertifikats für unsere Websites kennengelernt. Außerdem haben wir gesehen, wie Sie SSL auf einer Website mit der Methode requests.get überprüfen.
Anschließend haben wir die Python-SSL-Bibliothek vorgestellt und Schritt für Schritt erklärt, wie Sie in Python einen TLS/SSL-gesicherten Webserver erstellen und verwenden. Wir haben mit OpenSSL ein selbstsigniertes Zertifikat erstellt und es vor dem Start des Servers zu unserer HTTP-Socket-Verbindung hinzugefügt.
Mit dem anhaltenden Wachstum des Online-Handels nehmen auch Umfang und Komplexität von Cyberkriminalität zu. SSL-Zertifikate auf Ihren Websites wehren nicht nur die meisten Hacking-Versuche ab, sondern stärken auch das Vertrauen Ihrer Besucher. Lesen Sie diesen Artikel, um mehr darüber zu erfahren, warum Sie HTTPS verwenden sollten.
