So erstellen Sie ein selbstsigniertes SSL-Zertifikat für Nginx unter Debian 8

Einführung

TLS (Transport Layer Security) und sein Vorgänger SSL (Secure Sockets Layer) sind Webprotokolle, mit denen der normale Datenverkehr in einem geschützten, verschlüsselten Wrapper zusammengefasst wird.

Mithilfe dieser Technologie können Server Datenverkehr sicher zwischen Server und Clients senden, ohne dass die Nachrichten von Dritten abgefangen werden können. Das Zertifikatsystem unterstützt Benutzer auch bei der Überprüfung der Identität der Sites, mit denen sie eine Verbindung herstellen.

In diesem Handbuch zeigen wir Ihnen, wie Sie ein selbstsigniertes SSL-Zertifikat für die Verwendung mit einem Nginx-Webserver auf einem Debian 8-Server einrichten.

Voraussetzungen

Bevor Sie beginnen, sollten Sie einen Nicht-Root-Benutzer mit den Rechten "+ sudo +" konfiguriert haben. Sie können lernen, wie Sie ein solches Benutzerkonto einrichten, indem Sie unserer initial server setup for Debian 8 folgen.

Außerdem muss der Nginx-Webserver installiert sein. Wenn Sie einen kompletten LEMP-Stack (Linux, Nginx, MySQL, PHP) auf Ihrem Server installieren möchten, können Sie unserem Leitfaden unter https://www.digitalocean.com/community/tutorials/how-to-install-linux folgen -nginx-mysql-php-lemp-stack-on-debian-8 [LEMP unter Debian 8 einrichten].

Wenn Sie nur den Nginx-Webserver wollen, können Sie stattdessen unserer Anleitung unter https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-debian-8 folgen, um Nginx unter Debian 8 zu installieren.] .

Wenn Sie die Voraussetzungen erfüllt haben, fahren Sie unten fort.

Schritt 1: Erstellen Sie das SSL-Zertifikat

TLS / SSL verwendet eine Kombination aus einem öffentlichen Zertifikat und einem privaten Schlüssel. Der SSL-Schlüssel wird auf dem Server geheim gehalten. Es wird zum Verschlüsseln von an Clients gesendeten Inhalten verwendet. Das SSL-Zertifikat wird öffentlich für alle Benutzer freigegeben, die den Inhalt anfordern. Es kann verwendet werden, um den mit dem zugehörigen SSL-Schlüssel signierten Inhalt zu entschlüsseln.

Wir können mit OpenSSL in einem einzigen Befehl ein selbstsigniertes Paar aus Schlüssel und Zertifikat erstellen:

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

Sie werden eine Reihe von Fragen gestellt. Bevor wir darauf eingehen, werfen wir einen Blick darauf, was in dem Befehl passiert, den wir ausgeben:

  • * openssl *: Dies ist das grundlegende Befehlszeilentool zum Erstellen und Verwalten von OpenSSL-Zertifikaten, Schlüsseln und anderen Dateien.

  • * req *: Dieser Unterbefehl gibt an, dass die CSR-Verwaltung (Certificate Signing Request) von X.509 verwendet werden soll. Der „X.509“ ist ein Infrastrukturstandard für öffentliche Schlüssel, den SSL und TLS für die Verwaltung von Schlüsseln und Zertifikaten einhalten. Wir möchten ein neues X.509-Zertifikat erstellen und verwenden daher diesen Unterbefehl.

  • * -x509 *: Hierdurch wird der vorherige Unterbefehl weiter geändert, indem dem Dienstprogramm mitgeteilt wird, dass ein selbstsigniertes Zertifikat erstellt werden soll, anstatt wie normalerweise eine Zertifikatsignierungsanforderung zu generieren.

  • * -nodes *: Dies weist OpenSSL an, die Option zum Sichern unseres Zertifikats mit einer Passphrase zu überspringen. Wir brauchen Nginx, um die Datei ohne Benutzereingriff lesen zu können, wenn der Server gestartet wird. Eine Passphrase würde dies verhindern, da wir sie nach jedem Neustart eingeben müssten.

  • * -days 365 *: Diese Option legt fest, wie lange das Zertifikat als gültig angesehen wird. Wir setzen es für ein Jahr hier.

  • * -newkey rsa: 2048 *: Dies gibt an, dass gleichzeitig ein neues Zertifikat und ein neuer Schlüssel generiert werden sollen. Wir haben in einem vorherigen Schritt nicht den Schlüssel erstellt, der zum Signieren des Zertifikats erforderlich ist, und müssen ihn daher zusammen mit dem Zertifikat erstellen. Der Abschnitt "+ rsa: 2048 +" weist ihn an, einen RSA-Schlüssel mit einer Länge von 2048 Bit zu erstellen.

  • * -keyout *: Diese Zeile teilt OpenSSL mit, wo die generierte private Schlüsseldatei abgelegt werden soll, die wir erstellen.

  • * -out *: Hiermit wird OpenSSL mitgeteilt, wo das von uns erstellte Zertifikat abgelegt werden soll.

Wie oben erwähnt, werden mit diesen Optionen sowohl eine Schlüsseldatei als auch ein Zertifikat erstellt. Wir werden einige Fragen zu unserem Server stellen, um die Informationen korrekt in das Zertifikat einzubetten.

Füllen Sie die Eingabeaufforderungen entsprechend aus. * Die wichtigste Zeile ist die, die den allgemeinen Namen `+ anfordert (z. Server-FQDN oder IHR Name) + `. Sie müssen den Domänennamen eingeben, der Ihrem Server zugeordnet ist, oder wahrscheinlich die öffentliche IP-Adresse Ihres Servers. *

Die gesamten Eingabeaufforderungen sehen ungefähr so ​​aus:

OutputCountry Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

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

Während wir OpenSSL verwenden, sollten wir auch eine starke Diffie-Hellman-Gruppe erstellen, die zum Aushandeln von Perfect Forward Secrecy mit Clients verwendet wird.

Wir können dies tun, indem wir Folgendes eingeben:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Dies kann einige Minuten dauern, aber wenn dies erledigt ist, haben Sie eine starke DH-Gruppe unter "+ /etc/ssl/certs/dhparam.pem +", die wir in unserer Konfiguration verwenden können.

Schritt 2: Konfigurieren Sie Nginx für die Verwendung von SSL

Wir haben unsere Schlüssel- und Zertifikatsdateien im Verzeichnis "+ / etc / ssl +" erstellt. Jetzt müssen wir nur noch unsere Nginx-Konfiguration ändern, um diese Vorteile nutzen zu können.

Wir werden einige Anpassungen an unserer Konfiguration vornehmen.

  1. Wir erstellen ein Konfigurations-Snippet, das den Speicherort unseres SSL-Schlüssels und der Zertifikatsdatei enthält.

  2. Wir werden ein Konfigurations-Snippet mit starken SSL-Einstellungen erstellen, das in Zukunft für alle Zertifikate verwendet werden kann.

  3. Wir werden unsere Nginx-Serverblöcke anpassen, um SSL-Anforderungen zu verarbeiten, und die beiden obigen Snippets verwenden.

Diese Methode zur Konfiguration von Nginx ermöglicht es uns, saubere Serverblöcke zu erhalten und allgemeine Konfigurationssegmente in wiederverwendbare Module zu unterteilen.

Erstellen Sie ein Konfigurations-Snippet, das auf den SSL-Schlüssel und das Zertifikat verweist

Zuerst erstellen wir ein neues Nginx-Konfigurations-Snippet im Verzeichnis "+ / etc / nginx / snippets +".

Nennen wir die Datei "+ self-signed.conf +", um den Zweck dieser Datei richtig zu unterscheiden:

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

In dieser Datei müssen wir nur die Direktive "+ ssl_certificate " auf unsere Zertifikatsdatei und " ssl_certificate_key +" auf den zugehörigen Schlüssel setzen. In unserem Fall sieht das so aus:

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

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

Wenn Sie diese Zeilen hinzugefügt haben, speichern und schließen Sie die Datei.

Erstellen Sie ein Konfigurations-Snippet mit starken Verschlüsselungseinstellungen

Als Nächstes erstellen wir ein weiteres Snippet, das einige SSL-Einstellungen definiert. Dies wird Nginx mit einer starken SSL-Verschlüsselungssuite einrichten und einige erweiterte Funktionen aktivieren, die dazu beitragen, unseren Server sicher zu halten.

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

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

Um Nginx SSL sicher einzurichten, verwenden wir die Empfehlungen von Remy van Elst auf der Website https://cipherli.st [Cipherli.st]. Diese Website wurde entwickelt, um benutzerfreundliche Verschlüsselungseinstellungen für gängige Software bereitzustellen. Weitere Informationen zu seinen Entscheidungen bezüglich der Nginx-Auswahlmöglichkeiten finden Sie unter hier.

Für unsere Zwecke können wir die bereitgestellten Einstellungen vollständig kopieren. Wir müssen nur ein paar kleine Änderungen vornehmen.

Zunächst werden wir unseren bevorzugten DNS-Resolver für Upstream-Anforderungen hinzufügen. Für diesen Leitfaden verwenden wir die von Google. Wir werden auch vorgehen und die Einstellung + ssl_dhparam + so setzen, dass sie auf die Diffie-Hellman-Datei verweist, die wir zuvor generiert haben.

Zum Schluss sollten Sie sich einen Moment Zeit nehmen, um sich über HTTP Strict Transport Security (HSTS) und speziell über https://hstspreload.appspot.com/ [“zu informieren. Preload ”-Funktionalität. Das Vorladen von HSTS bietet erhöhte Sicherheit, kann jedoch weitreichende Konsequenzen haben, wenn es versehentlich oder falsch aktiviert wird. In diesem Handbuch werden die Einstellungen nicht vorab geladen, aber Sie können dies ändern, wenn Sie sicher sind, dass Sie die Auswirkungen verstehen:

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

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver  valid=300s;
resolver_timeout 5s;


add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

Da wir ein selbstsigniertes Zertifikat verwenden, wird die SSL-Heftung nicht verwendet. Nginx gibt einfach eine Warnung aus, deaktiviert das Heften für unser selbstsigniertes Zertifikat und funktioniert weiterhin ordnungsgemäß.

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Passen Sie die Nginx-Konfiguration an, um SSL zu verwenden

Nachdem wir unsere Snippets haben, können wir unsere Nginx-Konfiguration anpassen, um SSL zu aktivieren.

In diesem Handbuch wird davon ausgegangen, dass Sie die Standard-Serverblockdatei im Verzeichnis "+ / etc / nginx / sites-available +" verwenden. Wenn Sie eine andere Serverblockdatei verwenden, ersetzen Sie deren Namen in den folgenden Befehlen.

Bevor wir fortfahren, sichern wir zunächst unsere aktuelle Server-Blockdatei:

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

Öffnen Sie nun die Server-Blockdatei, um Anpassungen vorzunehmen:

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

Im Inneren beginnt Ihr Serverblock wahrscheinlich so:

/ etc / nginx / sites-available / default

server {
   listen 80 default_server;
   listen [::]:80 default_server;

   # SSL configuration

   # listen 443 ssl default_server;
   # listen [::]:443 ssl default_server;

   . . .

Diese Konfiguration wird so geändert, dass unverschlüsselte HTTP-Anforderungen automatisch zu verschlüsseltem HTTPS umgeleitet werden. Dies bietet die beste Sicherheit für unsere Websites. Wenn Sie sowohl HTTP- als auch HTTPS-Datenverkehr zulassen möchten, verwenden Sie die folgende alternative Konfiguration.

Wir werden die Konfiguration in zwei separate Blöcke aufteilen. Nach den beiden ersten "+ listen " - Direktiven fügen wir eine " server_name +" - Direktive hinzu, die auf den Domainnamen Ihres Servers oder, wahrscheinlicher, auf die IP-Adresse festgelegt ist. Wir richten dann eine Umleitung zum zweiten Serverblock ein, den wir erstellen. Anschließend schließen wir diesen kurzen Block:

/ etc / nginx / sites-available / default

server {
   listen 80 default_server;
   listen [::]:80 default_server;




   # SSL configuration

   # listen 443 ssl default_server;
   # listen [::]:443 ssl default_server;

   . . .

Als nächstes müssen wir einen neuen Serverblock direkt darunter starten, um die verbleibende Konfiguration aufzunehmen. Wir können die beiden "+ listen +" - Direktiven, die Port 443 verwenden, auskommentieren. Danach müssen wir nur noch die zwei Snippet-Dateien einfügen, die wir erstellt haben:

/ etc / nginx / sites-available / default

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   server_name ;
   return 302 https://$server_name$request_uri;
}



   # SSL configuration






   . . .

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

(Alternative Konfiguration) HTTP- und HTTPS-Verkehr zulassen

Wenn Sie sowohl verschlüsselten als auch unverschlüsselten Inhalt zulassen möchten oder müssen, müssen Sie Nginx etwas anders konfigurieren. Dies wird im Allgemeinen nicht empfohlen, wenn dies vermieden werden kann. In einigen Situationen kann dies jedoch erforderlich sein. Grundsätzlich komprimieren wir einfach die zwei separaten Serverblöcke zu einem Block und entfernen die Umleitung:

/ etc / nginx / sites-available / default

server {
   listen 80 default_server;
   listen [::]:80 default_server;



   server_name ;



   . . .

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Schritt 3: Passen Sie die Firewall an

Wenn Sie eine Firewall aktiviert haben, müssen Sie die Einstellungen anpassen, um SSL-Datenverkehr zuzulassen. Das erforderliche Verfahren hängt von der verwendeten Firewall-Software ab. Wenn Sie derzeit keine Firewall konfiguriert haben, können Sie vorwärts springen.

UFW

Wenn Sie * ufw * verwenden, können Sie die aktuelle Einstellung anzeigen, indem Sie Folgendes eingeben:

sudo ufw status

Es wird wahrscheinlich so aussehen, was bedeutet, dass nur HTTP-Verkehr zum Webserver erlaubt ist:

OutputStatus: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
WWW                        ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)
WWW (v6)                   ALLOW       Anywhere (v6)

Um zusätzlich HTTPS-Verkehr zuzulassen, können wir das Profil "WWW Full" zulassen und dann die redundante Berechtigung "WWW" löschen:

sudo ufw allow 'WWW Full'
sudo ufw delete allow 'WWW'

Ihr Status sollte jetzt so aussehen:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
WWW Full                   ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)
WWW Full (v6)              ALLOW       Anywhere (v6)

HTTPS-Anforderungen sollten jetzt von Ihrem Server akzeptiert werden.

IPTables

Wenn Sie "+ iptables +" verwenden, können Sie die aktuellen Regeln anzeigen, indem Sie Folgendes eingeben:

sudo iptables -S

Wenn Sie Regeln aktiviert haben, werden diese angezeigt. Eine Beispielkonfiguration könnte folgendermaßen aussehen:

Output-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Die zum Öffnen des SSL-Datenverkehrs erforderlichen Befehle hängen von Ihren aktuellen Regeln ab. Für einen grundlegenden Regelsatz wie den oben genannten können Sie den SSL-Zugriff hinzufügen, indem Sie Folgendes eingeben:

sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Wenn wir uns die Firewall-Regeln noch einmal ansehen, sollten wir die neue Regel sehen:

sudo iptables -S
Output-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Wenn Sie ein Programm verwenden, um "+ iptables +" - Regeln beim Booten automatisch anzuwenden, sollten Sie sicherstellen, dass Sie Ihre Konfiguration mit der neuen Regel aktualisieren.

Schritt 4: Aktivieren Sie die Änderungen in Nginx

Nachdem wir die Änderungen vorgenommen und die Firewall angepasst haben, können wir Nginx neu starten, um die neuen Änderungen zu implementieren.

Zuerst sollten wir überprüfen, ob unsere Dateien Syntaxfehler enthalten. Wir können dies tun, indem wir Folgendes eingeben:

sudo nginx -t

Wenn alles erfolgreich ist, erhalten Sie ein Ergebnis, das so aussieht:

Outputnginx: [warn] "ssl_stapling" ignored, issuer certificate not found
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Beachten Sie die Warnung am Anfang. Wie bereits erwähnt, wird bei dieser Einstellung eine Warnung ausgegeben, da unser selbstsigniertes Zertifikat kein SSL-Stapling verwenden kann. Dies wird erwartet und unser Server kann weiterhin Verbindungen korrekt verschlüsseln.

Wenn Ihre Ausgabe mit der obigen übereinstimmt, enthält Ihre Konfigurationsdatei keine Syntaxfehler. Wir können Nginx problemlos neu starten, um unsere Änderungen zu implementieren:

sudo systemctl restart nginx

Unser Server sollte nun über HTTPS erreichbar sein.

Schritt 5: Testen Sie die Verschlüsselung

Jetzt können Sie Ihren SSL-Server testen.

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

https://

Da das von uns erstellte Zertifikat nicht von einer der vertrauenswürdigen Zertifizierungsstellen Ihres Browsers signiert ist, wird wahrscheinlich eine beängstigend aussehende Warnung wie die folgende angezeigt:

Dies ist zu erwarten und normal. Wir interessieren uns nur für den Verschlüsselungsaspekt unseres Zertifikats, nicht für die Überprüfung der Authentizität unseres Hosts durch Dritte. Klicken Sie auf "ERWEITERT" und dann auf den bereitgestellten Link, um trotzdem zu Ihrem Host zu gelangen:

Sie sollten zu Ihrer Site weitergeleitet werden. Wenn Sie in die Adressleiste des Browsers schauen, werden Sie Hinweise auf eine teilweise Sicherheit sehen. Dies kann ein Schloss mit einem „x“ oder ein Dreieck mit einem Ausrufezeichen sein. In diesem Fall bedeutet dies nur, dass das Zertifikat nicht validiert werden kann. Es verschlüsselt immer noch Ihre Verbindung.

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

http://

Wenn das gleiche Symbol angezeigt wird, hat Ihre Umleitung ordnungsgemäß funktioniert.

Schritt 6: Wechseln Sie zu einer permanenten Umleitung

Wenn Ihre Umleitung ordnungsgemäß funktioniert hat und Sie sicher sind, dass Sie nur verschlüsselten Datenverkehr zulassen möchten, sollten Sie die Nginx-Konfiguration so ändern, dass die Umleitung dauerhaft ist.

Öffnen Sie die Konfigurationsdatei für den Serverblock erneut:

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

Suchen Sie das + return 302 + und ändern Sie es in + return 301 +:

/ etc / nginx / sites-available / default

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   server_name ;
   return  https://$server_name$request_uri;
}

. . .

Speichern und schließen Sie die Datei.

Überprüfen Sie Ihre Konfiguration auf Syntaxfehler:

sudo nginx -t

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

sudo systemctl restart nginx

Ihre Site sollte jetzt eine permanente Umleitung ausgeben, wenn über HTTP zugegriffen wird.

Fazit

Sie haben Ihren Nginx-Server so konfiguriert, dass für Clientverbindungen eine starke Verschlüsselung verwendet wird. Auf diese Weise können Sie Anfragen sicher bedienen und verhindern, dass Dritte Ihren Datenverkehr lesen.