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

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 verpackt 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 10-Server einrichten.

Voraussetzungen

Schritt 1 - SSL-Zertifikat erstellen

TLS / SSL verwendet eine Kombination aus einem öffentlichen Zertifikat und einem privaten Schlüssel. Der SSL-Schlüssel wird auf dem Server geheim gehalten und 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 beim Starten des Servers lesen zu können. 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 oder der öffentlichen IP-Adresse Ihres Servers zugeordnet ist. *

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/nginx/dhparam.pem 4096

Dies wird eine Weile dauern, aber wenn dies abgeschlossen ist, haben Sie eine starke DH-Gruppe unter "+ / etc / nginx / dhparam.pem +", die Sie in Ihrer Konfiguration verwenden können.

Schritt 2 - Konfigurieren von 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 eines Konfigurationsausschnitts, der 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 die Direktive "+ ssl_certificate" auf Ihre Zertifikatsdatei und die Direktive "+ ssl_certificate_key" auf den zugehörigen Schlüssel setzen. Fügen Sie der Datei die folgenden Zeilen hinzu:

/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 eines Konfigurationsausschnitts 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.

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.

Zweitens werden wir die Zeile auskommentieren, die den strengen Transportsicherheitsheader festlegt. Bevor Sie diese Zeile aus dem Kommentar entfernen, sollten Sie sich einen Moment Zeit nehmen, um sich unter HTTP Strict Transport Security (HSTS) und insbesondere unter https://hstspreload.org/ [nachzulesen. "Preload" -Funktionalität. Das Vorladen von HSTS bietet erhöhte Sicherheit, kann jedoch weitreichende Konsequenzen haben, wenn es versehentlich oder falsch aktiviert wird.

Kopieren Sie Folgendes in Ihre Snippet-Datei + ssl-params.conf +:

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

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
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 wir ein selbstsigniertes Zertifikat verwenden, wird die SSL-Heftung nicht verwendet. Nginx gibt eine Warnung aus, funktioniert jedoch weiterhin ordnungsgemäß.

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

Anpassen der Nginx-Konfiguration zur Verwendung von SSL

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

In diesem Handbuch wird davon ausgegangen, dass Sie eine benutzerdefinierte Serverblock-Konfigurationsdatei im Verzeichnis "+ / etc / nginx / sites-available " verwenden, wie in https://www.digitalocean.com/community/tutorials/how- beschrieben. to-install-nginx-on-debian-10 # step-5-% E2% 80% 93-setup-server-blocks [Step 5] des vorausgesetzten Tutorials zur Installation von Nginx. In diesem Beispiel wird " / etc / nginx / sites-available / +" verwendet. Ersetzen Sie Ihren Konfigurationsdateinamen / Domainnamen nach Bedarf.

Bevor wir fortfahren, sichern wir unsere aktuelle Konfigurationsdatei:

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

Öffnen Sie nun die Konfigurationsdatei, um Anpassungen vorzunehmen:

sudo nano /etc/nginx/sites-available/

Wenn Sie die Voraussetzungen erfüllt haben, sieht Ihr Serverblock folgendermaßen aus:

/ etc / nginx / sites-available / your_domain

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

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

   server_name  www.;

   location / {
           try_files $uri $uri/ =404;
   }

}

Ihre Datei kann in einer anderen Reihenfolge vorliegen. Anstelle der Direktiven "+ root " und " index " können Sie auch " location", "+ proxy_pass" oder andere benutzerdefinierte Konfigurationsanweisungen verwenden. Dies ist in Ordnung, da wir nur die "+ listen " - Direktiven aktualisieren und unsere SSL-Snippets einbinden müssen. Wir werden diesen vorhandenen Serverblock so ändern, dass er SSL-Datenverkehr auf Port " 443 " bereitstellt, und dann einen neuen Serverblock erstellen, der auf Port " 80 " antwortet und den Datenverkehr automatisch auf Port " 443 +" umleitet.

Aktualisieren Sie in Ihrer vorhandenen Konfigurationsdatei die beiden Anwei-

/ etc / nginx / sites-available / your_domain

server {
   listen ;
   listen [::]:;



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

   server_name  www.;

   . . .
}

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

/ etc / nginx / sites-available / your_domain

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

   server_name  www.;

   return 302 https://$server_name$request_uri;
}

Dies ist eine Bare-Bones-Konfiguration, die den Port "+ 80 +" überwacht und die Umleitung zu HTTPS durchführt. Speichern und schließen Sie die Datei, wenn Sie mit der Bearbeitung fertig sind.

Schritt 3 - Anpassen der Firewall

Wenn Sie die "+ ufw " - Firewall aktiviert haben, wie in den vorausgesetzten Handbüchern empfohlen, müssen Sie die Einstellungen anpassen, um SSL-Datenverkehr zuzulassen. Glücklicherweise registriert Nginx bei der Installation einige Profile mit ` ufw +`.

Wir können die verfügbaren Profile anzeigen, indem wir Folgendes eingeben:

sudo ufw app list

Sie sollten eine Liste wie diese sehen:

OutputAvailable applications:
. . .
 Nginx Full
 Nginx HTTP
 Nginx HTTPS
. . .

Sie können die aktuelle Einstellung anzeigen, indem Sie Folgendes eingeben:

sudo ufw status

Wenn Sie die Voraussetzungen erfüllt haben, sieht es so aus, dass nur HTTP-Datenverkehr zum Webserver zulässig ist:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Um zusätzlich HTTPS-Datenverkehr zuzulassen, können wir das Profil "Nginx Full" zulassen und anschließend die redundante Profilzulassung "Nginx HTTP" löschen:

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

Ihr Status sollte jetzt so aussehen:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Wenn unsere Firewall richtig konfiguriert ist, können wir mit dem Testen unserer Nginx-Konfiguration fortfahren.

Schritt 4 - Aktivieren der Ä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 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 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

Nachdem unsere Nginx-Konfiguration getestet wurde, können wir mit dem Testen unseres Setups fortfahren.

Schritt 5 - Testen der Verschlüsselung

Jetzt können wir unseren 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 wurde, wird wahrscheinlich eine beängstigend aussehende Warnung wie die folgende angezeigt (bei Verwendung von Google Chrome wird Folgendes 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 angegebenen Link, um zu Ihrem Host zu gelangen:

Sie sollten zu Ihrer Site weitergeleitet werden. Wenn Sie in die Adressleiste des Browsers schauen, sehen Sie ein Schloss mit einem „x“ darüber. 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 - Zu einer permanenten Umleitung wechseln

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/<^>your_domain^>

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

/ etc / nginx / sites-available / your_domain

   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

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.