Skip to main content

TLS/SSL in Python implementieren

Artikel von

Kingsley Ubah

feature python code purple

16. Oktober 2022

0 Min. Lesezeit

Heutzutage 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:

import requests

response=requests.get('https://twitter.com/')

print(response)

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.

import requests

response=requests.get('https://www.expired.badssl.com/')

print(response)

Dieses Mal erhalten wir eine Fehlermeldung, dass die Zertifikatsprüfung fehlgeschlagen ist:

requests.exceptions.SSLError: HTTPSConnectionPool(host='www. expired.badssl.com', port=443): Max retries exceeded with url : / (Caused by SSLError (SSLCertVerificationError(1, '[SSL:CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)’)))

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:

  1. Erstellen Sie den privaten RSA-Schlüssel.

  2. Erstellen Sie mit dem privaten Schlüssel eine Zertifikatsignierungsanforderung (CSR).

  3. 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:

sudo apt-get install openssl

Wenn Sie nicht sicher sind, ob OpenSSL bereits auf Ihrem Computer installiert ist, können Sie dies mit dem folgenden Befehl überprüfen:

openssl version

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.

openssl genrsa -out key.pem 2048

openssl genrsa -aes256 -out key.pem 2048

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:

openssl req -new -key key.pem -out signreq.csr

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:

openssl x509 -req -days 365 -in signreq.csr -signkey key.pem -out certificate.pem

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:

openssl x509 -text -noout -in certificate.pem

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.

import http.server
import ssl

httpd = http.server.HTTPServer(('localhost', 443),
http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket,
certfile='./certificate.pem', server_side=True, ssl_version=ssl.PROTOCOL_TLS
httpd.serve_forever()

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:

import requests
res = requests.get('https://localhost:443')

print(res)

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:

<Response [200]>

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.