Wie man ein selbstsigniertes SSL-Zertifikat für Nginx unter Ubuntu erstellt

0 Aktien
0
0
0
0

Einführung

TLS (Transport Layer Security) und sein Vorgänger SSL (Secure Sockets Layer) sind Webprotokolle, die zum Schutz und zur Verschlüsselung des Datenverkehrs in einem Computernetzwerk verwendet werden.

Mithilfe von TLS/SSL können Server den Datenverkehr zwischen Server und Clients sicher übertragen, ohne dass Dritte die Nachrichten abfangen können. Das Zertifikatssystem hilft Nutzern außerdem, die Identität der Websites zu überprüfen, mit denen sie interagieren.

In dieser Anleitung erfahren Sie, wie Sie ein selbstsigniertes SSL-Zertifikat zur Verwendung mit einem Nginx-Webserver auf einem Ubuntu-Server einrichten.

Voraussetzungen
  • Bevor Sie beginnen, benötigen Sie einen Benutzer ohne Root-Rechte, der über sudo-Berechtigungen verfügt und dessen Firewall aktiviert ist.
  • Sie müssen außerdem den Nginx-Webserver installieren.
  • Wenn Sie einen vollständigen LEMP-Stack (Linux, Nginx, MySQL, PHP) auf Ihrem Server installieren möchten.

Schritt 1 – Erstellen Sie ein TLS-Zertifikat

TLS/SSL funktioniert mit einer Kombination aus einem öffentlichen Zertifikat und einem privaten Schlüssel. Der SSL-Schlüssel wird auf dem Server geheim gehalten und verschlüsselt die an Clients gesendeten Inhalte. Das SSL-Zertifikat wird öffentlich an jeden weitergegeben, der die Inhalte anfordert. Es kann verwendet werden, um mit dem zugehörigen SSL-Schlüssel signierte Inhalte zu entschlüsseln.

Mit OpenSSL können Sie in einem einzigen Befehl ein selbstsigniertes Schlüsselpaar und ein Zertifikat generieren:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

Hier ist eine Zusammenfassung der Funktion jedes einzelnen Teils dieses Befehls:

  • sudoDer Befehl `sudo` ermöglicht es Mitgliedern der Gruppe `sudo`, ihre Berechtigungen temporär auf die eines anderen Benutzers (standardmäßig des Superusers oder Root-Benutzers) zu erhöhen. Dies ist in diesem Fall notwendig, da wir ein Zertifikat und ein Schlüsselpaar im Verzeichnis `/etc/` erstellen, auf das nur der Root-Benutzer oder andere privilegierte Konten zugreifen können.
  • opensslDies ist das wichtigste Kommandozeilen-Tool zum Erstellen und Verwalten von OpenSSL-Zertifikaten, Schlüsseln und anderen Dateien.
  • AnfrageDieser Unterbefehl legt fest, dass wir die Verwaltung von X.509-Zertifikatsignierungsanforderungen (CSR) verwenden möchten. “X.509” ist ein Standard für die Public-Key-Infrastruktur, an den sich SSL und TLS für ihre Schlüssel- und Zertifikatsverwaltung halten. Wir möchten ein neues X.509-Zertifikat erstellen und verwenden daher diesen Unterbefehl.
  • x509: Dies modifiziert den vorherigen Unterbefehl, indem es besagt, dass wir ein selbstsigniertes Zertifikat erstellen möchten, anstatt eine Zertifikatsignierungsanforderung zu erstellen, wie es normalerweise der Fall ist.
  • KnotenDies weist OpenSSL an, die Option zum Sichern unseres Zertifikats mit einer Passphrase zu überspringen. Nginx muss die Datei beim Serverstart ohne Benutzereingriff lesen können. Eine Passphrase verhindert dies, da sie nach jedem Neustart eingegeben werden muss.
  • -Tage 365Diese Option legt die Gültigkeitsdauer des Zertifikats fest. Hier ist sie auf ein Jahr eingestellt.
  • -newkey rsa:2048Gibt an, dass wir gleichzeitig ein neues Zertifikat und einen neuen Schlüssel generieren möchten. Da wir den zum Signieren des Zertifikats benötigten Schlüssel im vorherigen Schritt nicht erstellt haben, müssen wir ihn zusammen mit dem Zertifikat erstellen. Der Parameter „rsa:2048“ weist das System an, einen RSA-Schlüssel mit einer Länge von 2048 Bit zu erstellen.
  • -keyoutDiese Zeile teilt OpenSSL mit, wo die generierte private Schlüsseldatei, die wir erstellen, abgelegt werden soll.
  • -ausDies teilt OpenSSL mit, wo das zu erstellende Zertifikat abgelegt werden soll.

Wie bereits erwähnt, erstellen diese Optionen sowohl eine Schlüsseldatei als auch ein Zertifikat. Nach Ausführung dieses Befehls werden Ihnen einige Fragen zu Ihrem Server gestellt, um die Informationen korrekt in das Zertifikat einzubetten.

Füllen Sie die Befehle korrekt aus. Die wichtigste Zeile fragt nach dem gemeinsamen Namen (d. h. dem FQDN des Servers oder Ihrem Namen). Sie müssen den zu Ihrem Server gehörenden Domänennamen oder höchstwahrscheinlich die öffentliche IP-Adresse Ihres Servers eingeben.

Der vollständige Befehl lautet wie folgt:

Output
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com

Beide von Ihnen erstellten Dateien werden in den entsprechenden Unterverzeichnissen des Verzeichnisses /etc/ssl abgelegt.

Bei der Verwendung von OpenSSL sollten Sie auch eine starke Diffie-Hellman (DH)-Gruppe erstellen, die bei der Aushandlung mit Clients vollständige Vorwärtsgeheimhaltung verwendet.

Sie können dies tun, indem Sie Folgendes eingeben:

sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

Das wird eine Weile dauern, aber sobald es erledigt ist, verfügen Sie über eine starke DH-Gruppe in /etc/nginx/dhparam.pem, die während der Konfiguration verwendet wird.

Schritt 2 – Nginx für die Verwendung von SSL konfigurieren

Nachdem Ihre Schlüssel- und Zertifikatsdateien im Verzeichnis /etc/ssl erstellt wurden, müssen Sie Ihre Nginx-Konfiguration entsprechend anpassen.

Zuerst erstellen Sie ein Konfigurationsfragment mit Informationen zu den Speicherorten des SSL-Schlüssels und der Zertifikatsdatei. Anschließend erstellen Sie ein Konfigurationsfragment mit starken SSL-Einstellungen, das mit allen zukünftigen Zertifikaten verwendet werden kann. Abschließend konfigurieren Sie Ihre Nginx-Serverblöcke mithilfe der beiden erstellten Konfigurationsfragmente, sodass SSL-Anfragen korrekt verarbeitet werden.

Diese Methode zur Konfiguration von Nginx ermöglicht es Ihnen, Serverblöcke übersichtlich zu halten und häufig verwendete Konfigurationsabschnitte in wiederverwendbare Module auszulagern.

Erstellen Sie ein Konfigurationsfragment, das auf den SSL-Schlüssel und das Zertifikat verweist.

Erstellen Sie zunächst mit Ihrem bevorzugten Texteditor einen neuen Nginx-Konfigurationsabschnitt im Ordner /etc/nginx/snippets. Das folgende Beispiel verwendet nano.

Um den Zweck dieser Datei klar zu kennzeichnen, benennen Sie sie self-signed.conf:

sudo nano /etc/nginx/snippets/self-signed.conf

In dieser Datei müssen Sie die Direktive `ssl_certificate` auf die Zertifikatsdatei und `ssl_certificate_key` auf den zugehörigen Schlüssel setzen. Das sieht dann folgendermaßen aus:

ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

Nachdem Sie diese Zeilen hinzugefügt haben, speichern Sie die Datei und beenden Sie den Editor. Wenn Sie die Datei mit nano bearbeitet haben, können Sie dies mit Strg + X, Y und anschließend der Eingabetaste tun.

Erstellen Sie ein Konfigurationsfragment mit starken Verschlüsselungseinstellungen

Als Nächstes erstellen Sie ein weiteres Element, das einige SSL-Einstellungen definiert. Dadurch wird Nginx mit einer starken SSL-Verschlüsselungssuite konfiguriert und einige erweiterte Funktionen aktiviert, die zur Sicherheit Ihres Servers beitragen.

Die von Ihnen festgelegten Parameter können in zukünftigen Nginx-Konfigurationen wiederverwendet werden, sodass Sie der Datei einen generischen Namen geben können:

sudo nano /etc/nginx/snippets/ssl-params.conf

Um Nginx SSL sicher einzurichten, orientieren wir uns an den Empfehlungen von Cipherlist.eu. Cipherlist.eu ist eine hilfreiche und leicht verständliche Ressource zum Verständnis der Verschlüsselungseinstellungen gängiger Software.

Kopieren Sie für Ihre Zwecke die bereitgestellten Einstellungen exakt, allerdings müssen Sie vorher ein paar kleine Änderungen vornehmen.

Fügen Sie zunächst Ihren bevorzugten DNS-Resolver für Upstream-Anfragen hinzu. In dieser Anleitung verwenden wir Google (8.8.8.8 und 8.8.4.4).

Kommentieren Sie als Nächstes die Zeile aus, die den Strict Transport Security-Header angibt. Bevor Sie diese Zeile wieder aktivieren, sollten Sie sich kurz mit HTTP Strict Transport Security (HSTS) und insbesondere mit der “Preload”-Funktion vertraut machen. HSTS-Preload bietet zusätzliche Sicherheit, kann aber bei versehentlicher oder fehlerhafter Aktivierung weitreichende negative Folgen haben.

Fügen Sie Folgendes zu Ihrer ssl-params.conf-Fragmentdatei hinzu:

ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem; 
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

Da Sie ein selbstsigniertes Zertifikat verwenden, wird SSL-Stapling nicht genutzt. Nginx gibt eine Warnung aus und deaktiviert Stapling für unser signiertes Zertifikat, funktioniert aber anschließend weiterhin einwandfrei.

Wenn Sie fertig sind, speichern und schließen Sie die Datei, indem Sie STRG + X und dann Y und ENTER drücken.

Nginx für die Verwendung von SSL konfigurieren

Nachdem Sie nun alle benötigten Komponenten haben, können Sie die Nginx-Konfiguration anpassen, um SSL zu aktivieren.

Diese Anleitung setzt voraus, dass Sie eine benutzerdefinierte Serverblock-Konfigurationsdatei im Verzeichnis `/etc/nginx/sites-available` verwenden. Sie folgt außerdem den Konventionen des Nginx-Voraussetzungstutorials und verwendet in diesem Beispiel `/etc/nginx/sites-available/Ihre_Domain`. Ersetzen Sie gegebenenfalls den Namen Ihrer Konfigurationsdatei.

Bevor Sie fortfahren, sichern Sie Ihre aktuelle Konfigurationsdatei:

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

Öffnen Sie nun die Konfigurationsdatei, um die Einstellungen vorzunehmen:

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

Intern wird Ihr Serverblock wahrscheinlich zunächst in etwa wie folgt aussehen:

server {
listen 80;
listen [::]:80;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;
location / {
try_files $uri $uri/ =404;
}
}

Ihre Datei kann eine andere Reihenfolge aufweisen und anstelle von Stamm- und Verzeichnisanweisungen möglicherweise Standort-, Proxy-Passwort- oder andere benutzerdefinierte Konfigurationsanweisungen enthalten. Dies ist unproblematisch, da Sie lediglich die Listen-Anweisungen aktualisieren und die SSL-Komponenten hinzufügen müssen. Anschließend modifizieren Sie diesen bestehenden Serverblock, um SSL-Verkehr auf Port 443 zu verarbeiten, und erstellen einen neuen Serverblock, der auf Port 80 lauscht und den Datenverkehr automatisch auf Port 443 umleitet.

Aktualisieren Sie in der bestehenden Konfigurationsdatei die beiden Listen-Anweisungen, sodass sie Port 443 und SSL verwenden, und fügen Sie dann die beiden Fragmentdateien hinzu, die Sie in den vorherigen Schritten erstellt haben:

server {
listen 443 ssl;
listen [::]:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain.com www.your_domain.com;
location / {
try_files $uri $uri/ =404;
}
}

Fügen Sie als Nächstes einen zweiten Serverblock in die Konfigurationsdatei nach der schließenden geschweiften Klammer (}) des ersten Blocks ein:

server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com;
return 302 https://$server_name$request_uri;
}

Dies ist eine Minimalkonfiguration, die auf Port 80 lauscht und auf HTTPS umleitet. Wenn Sie die Bearbeitung abgeschlossen haben, speichern und schließen Sie die Datei mit Strg + X, dann Y und der Eingabetaste.

Schritt 3 – Firewall konfigurieren

Wenn Sie die ufw-Firewall wie in der Anleitung empfohlen aktiviert haben, müssen Sie die Einstellungen anpassen, um SSL-Datenverkehr zuzulassen. Glücklicherweise registriert Nginx bei der Installation einige Profile bei ufw.

Sie können die verfügbaren Profile durchsuchen, indem Sie Folgendes eingeben:

sudo ufw app list

Es erscheint eine Liste wie die folgende:

Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH

Die aktuellen Einstellungen können Sie mit dem Befehl sudo ufw status überprüfen:

sudo ufw status

Es wird wahrscheinlich die folgende Antwort erzeugt, was bedeutet, dass nur HTTP-Verkehr zum Webserver zugelassen ist:

Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)

Um HTTPS-Datenverkehr zu ermöglichen, können Sie die Berechtigungen des Profils «Nginx Full» aktualisieren und anschließend die zusätzliche Berechtigung «Nginx HTTP» entfernen:

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

Nach dem Ausführen von sudo ufw status sollten Sie folgende Ausgabe erhalten:

sudo ufw status
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)

Diese Ausgabe bestätigt, dass Ihre Firewall-Konfiguration erfolgreich abgeschlossen wurde und Sie nun bereit sind, die Änderungen in Nginx zu aktivieren.

Schritt 4 – Aktivieren Sie die Änderungen in Nginx

Sobald Sie die Änderungen und Konfigurationen Ihrer Firewall abgeschlossen haben, können Sie Nginx neu starten, um die neuen Änderungen anzuwenden.

Überprüfen Sie zunächst, ob die Dateien Syntaxfehler enthalten. Dies können Sie tun, indem Sie sudo nginx -t eingeben:

sudo nginx -t

Wenn alles erfolgreich verläuft, erhalten Sie ein Ergebnis, das folgendermaßen aussieht:

Output
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Beachten Sie den Warnhinweis am Anfang. Wie bereits erwähnt, erzeugt diese Einstellung eine Warnung, da Ihr signiertes Zertifikat keine SSL-Verschlüsselung unterstützt. Dies ist zu erwarten, und Ihr Server kann Verbindungen weiterhin ordnungsgemäß verschlüsseln.

Wenn Ihre Ausgabe mit unserem Beispiel übereinstimmt, enthält Ihre Konfigurationsdatei keine Syntaxfehler. In diesem Fall können Sie Nginx gefahrlos neu starten, um die Änderungen anzuwenden:

sudo systemctl restart nginx

Nachdem das System mit den neuen Änderungen neu gestartet wurde, können Sie mit dem Testen fortfahren.

Schritt 5 – Testen der Verschlüsselung

Jetzt können Sie Ihren SSL-Server testen.

Öffnen Sie Ihren Webbrowser und geben Sie in der Adressleiste https:// gefolgt vom Domainnamen oder der IP-Adresse Ihres Servers ein:

Je nach Browser erhalten Sie möglicherweise eine Warnung, weil das erstellte Zertifikat nicht von einer der vertrauenswürdigen Zertifizierungsstellen Ihres Browsers signiert wurde:


Diese Warnung ist zu erwarten und normal. Wir interessieren uns ausschließlich für die Verschlüsselung unseres Zertifikats, nicht für die Überprüfung der Anmeldeinformationen Ihres Hosts durch Dritte. Klicken Sie auf “Erweitert” und anschließend auf den bereitgestellten Link, um zu Ihrem Host zu gelangen.


Sie sollten nun auf Ihre Website weitergeleitet werden. In unserem Beispiel zeigt die Adressleiste Ihres Browsers ein Schloss mit einem “x” an. Dies bedeutet, dass das Zertifikat nicht verifiziert werden kann. Ihre Verbindung wird dennoch verschlüsselt. Beachten Sie, dass dieses Symbol je nach Browser unterschiedlich aussehen kann.

Wenn Sie Nginx mit zwei Serverblöcken konfiguriert haben, die HTTP-Inhalte automatisch auf HTTPS umleiten, können Sie auch überprüfen, ob die Umleitung ordnungsgemäß funktioniert:

Wenn dabei dasselbe Symbol angezeigt wird, bedeutet dies, dass Ihre Weiterleitung korrekt funktioniert hat.

Schritt 6 – Auf eine dauerhafte Weiterleitung umstellen

Wenn Ihre Weiterleitung ordnungsgemäß funktioniert hat und Sie sicher sind, dass Sie nur verschlüsselten Datenverkehr zulassen möchten, müssen Sie die Nginx-Konfiguration ändern, um die Weiterleitung dauerhaft zu machen.

Öffnen Sie Ihre Serverblock-Konfigurationsdatei erneut:

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

Suchen Sie die 302-Weiterleitung und ändern Sie sie in eine 301-Weiterleitung:

 return 301 https://$server_name$request_uri;

Speichern und schließen Sie die Datei durch Drücken von STRG + X, dann Y und ENTER.

Überprüfen Sie Ihre Einstellungen auf Syntaxfehler:

sudo nginx -t

Wenn Sie bereit sind, starten Sie Nginx neu, um die Weiterleitung dauerhaft zu machen:

sudo systemctl restart nginx

Nach einem Neustart werden die Änderungen wirksam und Ihre Weiterleitung ist nun dauerhaft.

Ergebnis

Sie haben Ihren Nginx-Server so konfiguriert, dass er starke Verschlüsselung für Client-Verbindungen verwendet. Dadurch können Sie Anfragen sicher bearbeiten und verhindern, dass Dritte Ihren Datenverkehr mitlesen. Alternativ können Sie ein selbstsigniertes SSL-Zertifikat verwenden, das Sie von Let's Encrypt erhalten, einer Zertifizierungsstelle, die kostenlose TLS/SSL-Zertifikate installiert und verschlüsseltes HTTPS auf Webservern ermöglicht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Das könnte Ihnen auch gefallen