HTTPS mit einem selbstsignierten Zertifikat auf Nginx unter Linux

CompTIABeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie einen Nginx-Webserver unter Linux durch die Implementierung von HTTPS mit einem selbstsignierten Zertifikat absichern. Sie beginnen mit der Installation des Nginx-Webservers und stellen sicher, dass er korrekt läuft, um die Grundlage für die sichere Konfiguration zu schaffen. Nach der anfänglichen Einrichtung verwenden Sie das OpenSSL-Toolkit, um ein selbstsigniertes SSL-Zertifikat zu generieren, eine kritische Komponente für die Ermöglichung verschlüsselter Kommunikation.

Sobald das Zertifikat erstellt ist, fahren Sie mit der Änderung der Nginx-Konfiguration fort, um Webinhalte über das sichere HTTPS-Protokoll bereitzustellen. Die letzten Schritte des Labs konzentrieren sich auf die Verifizierung und das Testen. Sie aktivieren die neue Konfiguration und verwenden Befehlszeilentools wie curl und openssl, um die HTTPS-Verbindung zu testen und die Details Ihres neu erstellten selbstsignierten Zertifikats zu überprüfen, um zu bestätigen, dass Ihr Server ordnungsgemäß gesichert ist.

Nginx Webserver installieren und starten

In diesem Schritt installieren Sie den Nginx-Webserver. Nginx ist ein Hochleistungs-Webserver, der häufig zum Ausliefern von Webinhalten verwendet wird. Wir werden ihn zuerst installieren und dann überprüfen, ob er korrekt läuft. Diese laufende Nginx-Instanz dient als Grundlage für unsere nachfolgende HTTPS-Konfiguration.

Zuerst ist es eine bewährte Methode, die Paketliste Ihres Systems zu aktualisieren, um sicherzustellen, dass Sie die neuesten Softwareversionen erhalten.

Führen Sie den folgenden Befehl in Ihrem Terminal aus:

sudo apt update

Sie werden sehen, wie das System Paketinformationen von seinen konfigurierten Quellen abruft. Die Ausgabe wird in etwa so aussehen:

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
...
Fetched 1,585 kB in 2s (924 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

Nun können Sie mit der Installation von Nginx fortfahren. Wir verwenden den Befehl apt install. Das Flag -y wird hinzugefügt, um die Installation automatisch zu bestätigen und interaktive Aufforderungen zu vermeiden.

sudo apt install nginx -y

Der Installationsprozess lädt Nginx und seine Abhängigkeiten herunter und richtet sie ein. Nach Abschluss sollten Sie eine Ausgabe sehen, die angibt, dass das Paket nginx eingerichtet wurde.

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  nginx-common nginx-core
...
Setting up nginx-common (1.18.0-6ubuntu14.4) ...
Setting up nginx-core (1.18.0-6ubuntu14.4) ...
Setting up nginx (1.18.0-6ubuntu14.4) ...
Processing triggers for ufw (0.36.1-4ubuntu0.1) ...
Processing triggers for man-db (2.10.2-1) ...

Obwohl der Installationsprozess den Dienst oft startet, ist es eine gute Praxis, ihn explizit zu verwalten. Wir werden systemctl verwenden, das Standarddienstprogramm zur Steuerung von Diensten auf modernen Linux-Systemen.

Starten Sie den Nginx-Dienst mit diesem Befehl:

sudo systemctl start nginx

Dieser Befehl erzeugt keine Ausgabe, wenn er erfolgreich ausgeführt wird. Um zu bestätigen, dass der Dienst läuft, überprüfen Sie seinen Status.

sudo systemctl status nginx

Die Ausgabe liefert detaillierte Informationen über den Dienst. Achten Sie auf die Zeile Active: active (running), die bestätigt, dass Nginx gestartet ist und läuft.

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-30 08:30:00 UTC; 5s ago
       Docs: man:nginx(8)
   Main PID: 1234 (nginx)
      Tasks: 2 (limit: 4617)
     Memory: 4.8M
        CPU: 43ms
     CGroup: /system.slice/nginx.service
             ├─1234 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             └─1235 "nginx: worker process"

Sie haben nun den Nginx-Webserver erfolgreich installiert und gestartet. Im nächsten Schritt generieren Sie ein digitales Zertifikat, das eine Voraussetzung für die Aktivierung von HTTPS ist.

Selbstsigniertes SSL-Zertifikat mit OpenSSL generieren

In diesem Schritt erstellen Sie ein selbstsigniertes digitales Zertifikat und seinen entsprechenden privaten Schlüssel. Um HTTPS zu aktivieren, benötigt ein Webserver ein digitales Zertifikat, um seine Identität gegenüber Clients nachzuweisen, und einen privaten Schlüssel, um eine sichere, verschlüsselte Verbindung herzustellen. Wir werden das Befehlszeilen-Tool openssl verwenden, ein robustes Dienstprogramm für die Arbeit mit SSL/TLS.

Ein digitales Zertifikat bindet einen öffentlichen Schlüssel an eine Identität (wie den Domainnamen einer Website). Normalerweise werden Zertifikate von einer vertrauenswürdigen Zertifizierungsstelle (CA) ausgestellt und signiert. Für Test- und Entwicklungszwecke können wir jedoch ein selbstsigniertes Zertifikat erstellen, das von seinem eigenen Ersteller signiert wird. Obwohl Browser bei solchen Zertifikaten eine Sicherheitswarnung anzeigen, sind sie für eine Laborumgebung wie diese voll funktionsfähig.

Zuerst erstellen wir ein dediziertes Verzeichnis innerhalb des Nginx-Konfigurationsordners, um unser SSL-Zertifikat und unseren Schlüssel zu speichern. Dies hält unsere Dateien organisiert und sicher.

sudo mkdir -p /etc/nginx/ssl

Nun verwenden wir einen einzigen openssl-Befehl, um sowohl den 2048-Bit RSA-Privatschlüssel als auch das selbstsignierte Zertifikat zu generieren, das 365 Tage gültig ist. Wir werden sie direkt in das Verzeichnis /etc/nginx/ssl/ legen.

Hier ist eine Aufschlüsselung der Befehlsoptionen:

  • req -x509: Erstellt ein selbstsigniertes Zertifikat.
  • -nodes: Verhindert, dass der private Schlüssel mit einer Passphrase verschlüsselt wird. Dies ist wichtig, damit Nginx ohne manuelles Eingreifen starten kann.
  • -days 365: Legt die Gültigkeitsdauer des Zertifikats auf ein Jahr fest.
  • -newkey rsa:2048: Generiert einen neuen 2048-Bit RSA-Privatschlüssel.
  • -keyout: Gibt die Ausgabedatei für den privaten Schlüssel an (/etc/nginx/ssl/nginx.key).
  • -out: Gibt die Ausgabedatei für das Zertifikat an (/etc/nginx/ssl/nginx.crt).
  • -subj: Stellt die Betreffinformationen des Zertifikats nicht-interaktiv bereit. CN=localhost ist der Common Name (gemeinsamer Name), der mit der Adresse übereinstimmen muss, die Sie für den Zugriff auf die Website verwenden.

Führen Sie den folgenden Befehl aus:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/nginx/ssl/nginx.key \
  -out /etc/nginx/ssl/nginx.crt \
  -subj "/C=US/ST=State/L=City/O=LabOrg/OU=IT/CN=localhost"

Nach Ausführung des Befehls sehen Sie eine Ausgabe, die die Schlüsselgenerierung bestätigt.

Generating a RSA private key
writing new private key to '/etc/nginx/ssl/nginx.key'
-----

Der private Schlüssel (/etc/nginx/ssl/nginx.key) ist äußerst sensibel. Wenn er kompromittiert wird, könnte ein Angreifer Ihren Server nachahmen. Daher ist es entscheidend, seine Dateiberechtigungen so einzuschränken, dass nur der Root-Benutzer ihn lesen kann.

sudo chmod 600 /etc/nginx/ssl/nginx.key

Dieser Befehl setzt die Berechtigungen auf Lesen und Schreiben nur für den Eigentümer (root) und keine Berechtigungen für andere. Dies ist eine entscheidende Sicherheitsmaßnahme.

Ausgezeichnet! Sie haben nun ein selbstsigniertes Zertifikat (nginx.crt) und einen sicheren privaten Schlüssel (nginx.key) erstellt. Im nächsten Schritt konfigurieren Sie Nginx so, dass diese beiden Dateien verwendet werden, um HTTPS zu aktivieren.

Nginx für HTTPS-Inhaltsauslieferung konfigurieren

In diesem Schritt passen Sie die Nginx-Konfiguration an, um HTTPS zu aktivieren. Da das Zertifikat und der private Schlüssel aus dem vorherigen Schritt bereitstehen, müssen Sie Nginx nun anweisen, diese zu verwenden. Dies beinhaltet die Bearbeitung der Nginx-Site-Konfigurationsdatei, um auf Port 443 (dem Standardport für HTTPS) zu lauschen und die Pfade zu Ihren Zertifikats- und Schlüsseldateien anzugeben.

Bevor Sie eine Konfigurationsdatei bearbeiten, ist es eine gute Praxis, ein Backup zu erstellen. Dies ermöglicht es Ihnen, bei Problemen einfach zum ursprünglichen Zustand zurückzukehren. Sichern wir die Standard-Nginx-Site-Konfigurationsdatei.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

Nun bearbeiten Sie die Hauptkonfigurationsdatei mit dem Texteditor nano. Diese Datei enthält Serverblöcke, die definieren, wie Nginx eingehende Anfragen behandelt.

sudo nano /etc/nginx/sites-available/default

Innerhalb des nano-Editors sehen Sie einen Standard-Serverblock, der für HTTP auf Port 80 konfiguriert ist. Scrollen Sie nach unten, bis Sie den Abschnitt für die SSL-Konfiguration finden, der normalerweise auskommentiert ist. Sie müssen diesen Abschnitt auskommentieren und sicherstellen, dass er mit der folgenden Konfiguration übereinstimmt. Dieser Block weist Nginx an, auf Port 443 auf sichere Verbindungen zu lauschen und gibt an, welches Zertifikat und welchen Schlüssel für den TLS-Handshake verwendet werden sollen.

Löschen Sie den vorhandenen auskommentierten SSL-Serverblock und ersetzen Sie ihn durch den folgenden Inhalt, oder kommentieren Sie ihn einfach aus und bearbeiten Sie ihn entsprechend.

## --- CONTENT TO ADD/UNCOMMENT IN /etc/nginx/sites-available/default ---
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name localhost;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    location / {
        try_files $uri $uri/ =404;
    }
}
## --- END CONTENT ---

Hier ist die Bedeutung dieser Direktiven:

  • listen 443 ssl: Weist Nginx an, auf eingehende Verbindungen auf Port 443 zu lauschen und diese über das SSL/TLS-Protokoll zu verarbeiten.
  • server_name localhost: Definiert, welcher Serverblock für Anfragen an localhost verwendet werden soll.
  • ssl_certificate: Gibt den Pfad zu Ihrer öffentlichen Zertifikatsdatei (nginx.crt) an.
  • ssl_certificate_key: Gibt den Pfad zu Ihrer privaten Schlüsseldatei (nginx.key) an.

Nachdem Sie den Inhalt hinzugefügt haben, speichern Sie die Datei und beenden Sie nano, indem Sie Ctrl+X drücken, gefolgt von Y und dann Enter.

Bevor Sie die Änderungen anwenden, ist es entscheidend, die Nginx-Konfiguration auf Syntaxfehler zu testen. Dies verhindert, dass eine fehlerhafte Konfiguration Ihren Webserver lahmlegt.

sudo nginx -t

Wenn die Konfiguration korrekt ist, sehen Sie eine Erfolgsmeldung.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Wenn Sie Fehler sehen, öffnen Sie die Konfigurationsdatei erneut und überprüfen Sie sorgfältig auf Tippfehler oder fehlende Semikolons.

Sie haben nun Nginx erfolgreich konfiguriert, um Inhalte über HTTPS auszuliefern. Der nächste Schritt ist die Anwendung dieser Änderungen durch Neustart des Dienstes und Testen der Verbindung.

HTTPS-Konfiguration mit curl aktivieren und testen

In diesem Schritt wenden Sie die neue Nginx-Konfiguration an und bestätigen, dass Ihr Webserver korrekt Inhalte über HTTPS ausliefert. Obwohl Sie die Konfigurationsdatei auf der Festplatte geändert haben, verwendet der laufende Nginx-Prozess immer noch die alte Konfiguration. Sie müssen den Dienst neu starten, damit die Änderungen wirksam werden.

Um die neue Konfiguration anzuwenden, starten Sie den Nginx-Dienst mit systemctl neu.

sudo systemctl restart nginx

Dieser Befehl erzeugt keine Ausgabe, wenn er erfolgreich ist. Nginx lauscht nun auf Port 443 und ist bereit, HTTPS-Anfragen mit dem von Ihnen bereitgestellten Zertifikat und Schlüssel zu bearbeiten.

Testen wir nun den HTTPS-Endpunkt. Wir verwenden curl, ein Befehlszeilen-Tool für die Datenübertragung mit URLs. Wir versuchen, die Homepage von unserem Server über das Protokoll https:// abzurufen.

Wenn Sie sich über HTTPS mit einem Server verbinden, prüft Ihr Client (in diesem Fall curl), ob das Zertifikat des Servers von einer vertrauenswürdigen Zertifizierungsstelle (CA) signiert wurde. Da wir ein selbstsigniertes Zertifikat erstellt haben, wird es standardmäßig nicht als vertrauenswürdig eingestuft, und curl wird die Verbindung verweigern und einen Fehler bei der Zertifikatsvalidierung anzeigen.

Um dies für unseren Test zu umgehen, verwenden wir das Flag -k oder --insecure. Dieses Flag weist curl an, die Zertifikatsvalidierung zu überspringen. Dies ist unsicher und sollte nicht in der Produktion verwendet werden, ist aber für das Testen eines selbstsignierten Zertifikats in einer Laborumgebung notwendig.

Führen Sie den folgenden Befehl aus, um Ihren HTTPS-Server zu testen:

curl -k https://localhost

Wenn Ihre Konfiguration korrekt ist, wird curl erfolgreich eine Verbindung zum Server herstellen und den HTML-Inhalt der Standard-Nginx-Begrüßungsseite ausgeben.

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Der Erhalt dieser HTML-Ausgabe bestätigt, dass Ihr Nginx-Server erfolgreich konfiguriert ist und Inhalte über eine verschlüsselte HTTPS-Verbindung ausliefert. Im letzten Schritt erfahren Sie, wie Sie das Zertifikat inspizieren können, das der Server präsentiert.

SSL-Zertifikat des Servers mit OpenSSL inspizieren

In diesem letzten Schritt untersuchen Sie die Details des digitalen Zertifikats, das Ihr Nginx-Server an Clients präsentiert. Dies ist eine entscheidende Fähigkeit zur Fehlerbehebung bei TLS/HTTPS-Problemen und zur Überprüfung der Identität eines Servers. Sie verwenden erneut das Tool openssl, diesmal jedoch als Client, um sich mit Ihrem eigenen Server zu verbinden und das von ihm bereitgestellte Zertifikat zu inspizieren.

Wir werden eine Kombination aus zwei openssl-Befehlen verwenden, die durch eine Pipe (|) verbunden sind.

  • openssl s_client -connect localhost:443: Dieser Befehl fungiert als generischer SSL/TLS-Client und stellt eine Verbindung zum angegebenen Server und Port her. Er gibt das Zertifikat des Servers zusammen mit Sitzungsdetails aus.
  • openssl x509 -text -noout: Dieser Befehl wird verwendet, um die Inhalte eines X.509-Zertifikats in einem für Menschen lesbaren Format zu parsen und anzuzeigen.

Wir werden die Ausgabe von s_client direkt an x509 weiterleiten, um das Zertifikat "on the fly" zu parsen. Das echo | am Anfang verhindert, dass s_client auf Benutzereingaben wartet, und 2>/dev/null unterdrückt Statusmeldungen zur Verbindung. Zur besseren Übersichtlichkeit speichern wir die Ausgabe in einer Datei.

Führen Sie den folgenden Befehl aus, um eine Verbindung zu Ihrem Server herzustellen, das Zertifikat zu extrahieren, es zu parsen und die Details in einer Datei namens /tmp/server_certificate_details.txt zu speichern.

echo | openssl s_client -connect localhost:443 2> /dev/null | openssl x509 -text -noout > /tmp/server_certificate_details.txt

Zeigen Sie nun den Inhalt der gerade erstellten Datei an, um die Zertifikatsdetails anzuzeigen.

cat /tmp/server_certificate_details.txt

Sie sehen eine detaillierte Aufschlüsselung der Eigenschaften des Zertifikats.

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = State, L = City, O = LabOrg, OU = IT, CN = localhost
        Validity
            Not Before: Oct 30 09:00:00 2023 GMT
            Not After : Oct 29 09:00:00 2024 GMT
        Subject: C = US, ST = State, L = City, O = LabOrg, OU = IT, CN = localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:
                    ...
                Exponent: 65537 (0x10001)
...

Nehmen Sie sich einen Moment Zeit, um die Ausgabe zu prüfen. Beachten Sie diese wichtigen Felder:

  • Issuer: Die Entität, die das Zertifikat signiert hat.
  • Subject: Die Entität, für die das Zertifikat ausgestellt wurde.
  • CN (Common Name): Die spezifische Domain, für die das Zertifikat bestimmt ist (localhost).

Da es sich um ein selbstsigniertes Zertifikat handelt, sind die Felder Issuer und Subject identisch. Dies ist das definierende Merkmal eines selbstsignierten Zertifikats. Sie können auch den Gültigkeitszeitraum und die Details des öffentlichen Schlüssels sehen.

Herzlichen Glückwunsch! Sie haben erfolgreich einen Nginx-Webserver mit einem selbstsignierten SSL-Zertifikat eingerichtet, ihn für HTTPS konfiguriert, die Verbindung getestet und die Zertifikatsdetails überprüft. Sie haben nun ein grundlegendes Verständnis der Komponenten, die an der Sicherung des Webverkehrs mit TLS/HTTPS beteiligt sind.

Zusammenfassung

In diesem Lab haben Sie den End-to-End-Prozess der Implementierung von HTTPS auf einem Nginx-Webserver in einer Linux-Umgebung mit einem selbstsignierten Zertifikat kennengelernt. Sie begannen mit der Einrichtung der Grundlagen, die die Aktualisierung der Paketliste des Systems und die Installation des Nginx-Webservers mit dem apt-Paketmanager umfassten. Der Kern des Labs konzentrierte sich auf die Sicherheit, wo Sie das OpenSSL-Toolkit verwendeten, um einen privaten Schlüssel und ein entsprechendes selbstsigniertes SSL-Zertifikat zu generieren, die die wesentlichen Komponenten für die Aktivierung verschlüsselter Verbindungen sind.

Nachdem das Zertifikat erstellt war, haben Sie mit der Konfiguration des Nginx-Servers fortgefahren. Dies beinhaltete die Änderung seiner Konfigurationsdateien, um einen Serverblock zu erstellen, der auf Port 443 für HTTPS-Verkehr lauscht, und ihn auf die Pfade Ihres neuen Zertifikats und privaten Schlüssels zu verweisen. Um den Prozess abzuschließen, haben Sie die neue Konfiguration aktiviert und wichtige Verifizierungsschritte durchgeführt. Sie haben den curl-Befehl verwendet, um die HTTPS-Verbindung von der Befehlszeile aus zu testen und bestätigt, dass der Server sicher antwortete. Schließlich haben Sie OpenSSL als Client-Tool verwendet, um das Zertifikat des Servers zu inspizieren und zu validieren, dass das richtige Zertifikat ausgeliefert wurde.