So erstellen Sie ein selbstsigniertes SSL-Zertifikat für Nginx in Ubuntu 18.04

Eine frühere Version dieses Tutorials wurde vonJustin Ellingwood geschrieben

Einführung

TLS oder Transport Layer Security und sein VorgängerSSL, der für Secure Sockets Layer steht, sind Webprotokolle, mit denen normaler Datenverkehr in einen geschützten, verschlüsselten Wrapper eingeschlossen 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 Ubuntu 18.04-Server einrichten.

[.Hinweis]##

Note: Ein selbstsigniertes Zertifikat verschlüsselt die Kommunikation zwischen Ihrem Server und allen Clients. Da es jedoch nicht von einer der vertrauenswürdigen Zertifizierungsstellen signiert ist, die in den Webbrowsern enthalten sind, können Benutzer das Zertifikat nicht verwenden, um die Identität Ihres Servers automatisch zu überprüfen.

Ein selbstsigniertes Zertifikat ist möglicherweise geeignet, wenn Sie keinen Domänennamen mit Ihrem Server verknüpft haben und wenn die verschlüsselte Webschnittstelle nicht für Benutzer sichtbar ist. Wenn Siedo einen Domainnamen haben, ist es in vielen Fällen besser, ein CA-signiertes Zertifikat zu verwenden. Sie erfahren, wie Sie mit dem Let's Encrypt-Projekthere.
ein kostenloses vertrauenswürdiges Zertifikat einrichten

Voraussetzungen

Bevor Sie beginnen, sollte ein Benutzer ohne Rootberechtigung mit den Berechtigungen vonsudokonfiguriert sein. Sie können lernen, wie Sie ein solches Benutzerkonto einrichten, indem Sie unsereninitial server setup for Ubuntu 18.04 folgen.

Außerdem muss der Nginx-Webserver installiert sein. Wenn Sie einen gesamten LEMP-Stack (Linux, Nginx, MySQL, PHP) auf Ihrem Server installieren möchten, können Sie unserer Anleitung zusetting up LEMP on Ubuntu 18.04 folgen.

Wenn Sie nur den Nginx-Webserver möchten, können Sie stattdessen unserer Anleitung zuinstalling Nginx on Ubuntu 18.04 folgen.

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

[[Schritt-1 -–- Erstellen des SSL-Zertifikats]] == Schritt 1 - Erstellen des SSL-Zertifikats

TLS/SSL works by using a combination of a public certificate and a private key. 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 (X.509 Certificate Signing Request) 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: Dadurch 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 Teilrsa: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, die wir erstellen, abgelegt werden soll.

  • -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. The most important line is the one that requests the Common Name (e.g. server FQDN or YOUR name). You need to enter the domain name associated with your server or, more likely, your server’s public IP address.

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

OutputCountry 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/sslabgelegt.

Während wir OpenSSL verwenden, sollten wir auch eine starke Diffie-Hellman-Gruppe erstellen, die bei der Aushandlung vonPerfect 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 erledigt ist, haben Sie eine starke DH-Gruppe bei/etc/nginx/dhparam.pem, die wir in unserer Konfiguration verwenden können.

[[Schritt-2 -–- Konfigurieren von Nginx-to-Use-SSL]] == Schritt 2 - Konfigurieren von Nginx für die Verwendung von SSL

Wir haben unsere Schlüssel- und Zertifikatdateien im Verzeichnis/etc/sslerstellt. 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 Konfigurations-Snippets, das auf den SSL-Schlüssel und das Zertifikat verweist

Erstellen wir zunächst ein neues Nginx-Konfigurations-Snippet im Verzeichnis/etc/nginx/snippets.

Um den Zweck dieser Datei richtig zu unterscheiden, nennen wir sieself-signed.conf:

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

In dieser Datei müssen wir die Direktivessl_certificate auf unsere Zertifikatdatei und die Direktivessl_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 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 derCipherli.st-Seite. Diese Website wurde entwickelt, um benutzerfreundliche Verschlüsselungseinstellungen für gängige Software bereitzustellen.

[.Hinweis]##

Die vorgeschlagenen Einstellungen auf der oben verlinkten Website bieten starke Sicherheit. Dies geht manchmal zu Lasten einer größeren Client-Kompatibilität. Wenn Sie ältere Clients unterstützen müssen, gibt es eine alternative Liste, auf die Sie zugreifen können, indem Sie auf den Link auf der Seite mit der Bezeichnung "Ja, geben Sie mir eine Verschlüsselungssuite, die mit älterer / alter Software funktioniert" klicken. Diese Liste kann anstelle der kopierten Elemente verwendet werden unten.

Die Wahl der von Ihnen verwendeten Konfiguration hängt weitgehend davon ab, was Sie unterstützen müssen. Beide bieten eine hohe Sicherheit.

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 auskommentieren, sollten Sie sich einen Moment Zeit nehmen, umHTTP Strict Transport Security, or HSTS und insbesondere“preload” functionality zu lesen. Das Vorladen von HSTS bietet erhöhte Sicherheit, kann jedoch weitreichende Konsequenzen haben, wenn es versehentlich oder falsch aktiviert wird.

Kopieren Sie Folgendes in die Snippet-Datei Ihresssl-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, deaktiviert das Heften für unser selbstsigniertes Zertifikat und funktioniert 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-availableverwenden. Wir werden für dieses Beispiel/etc/nginx/sites-available/example.com verwenden. Ersetzen Sie Ihren Konfigurationsdateinamen nach Bedarf.

Bevor wir fortfahren, sichern wir unsere aktuelle Konfigurationsdatei:

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

Öffnen Sie nun die Konfigurationsdatei, um Anpassungen vorzunehmen:

sudo nano /etc/nginx/sites-available/example.com

Im Inneren beginnt Ihr Serverblock wahrscheinlich ungefähr so:

/etc/nginx/sites-available/example.com

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

    server_name example.com www.example.com;

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

    . . .
}

Ihre Datei befindet sich möglicherweise in einer anderen Reihenfolge. Anstelle der Anweisungenroot undindex können Sie einigelocation,proxy_pass oder andere benutzerdefinierte Konfigurationsanweisungen verwenden. Dies ist in Ordnung, da wir nur die Direktiven vonlistenaktualisieren und unsere SSL-Snippets einschließen müssen. Wir werden diesen vorhandenen Serverblock ändern, um den SSL-Verkehr auf Port 443 zu bedienen, und dann einen neuen Serverblock erstellen, der auf Port 80 antwortet und den Verkehr automatisch auf Port 443 umleitet.

[.note] #Note: Wir werden eine 302-Umleitung verwenden, bis wir überprüft haben, dass alles ordnungsgemäß funktioniert. Danach können wir dies in eine permanente 301-Umleitung ändern.
#

Aktualisieren Sie in Ihrer vorhandenen Konfigurationsdatei die zweilisten-Anweisungen, um Port 443 und ssl zu verwenden, und fügen Sie dann die beiden Snippet-Dateien hinzu, die wir in den vorherigen Schritten erstellt haben:

/etc/nginx/sites-available/example.com

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

    server_name example.com www.example.com;

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

    . . .
}

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

/etc/nginx/sites-available/example.com

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

    server_name example.com www.example.com;

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

Dies ist eine Bare-Bones-Konfiguration, die 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]] == Schritt 3 - Anpassen der Firewall

Wenn Sie die Firewall vonufwaktiviert haben, wie in den erforderlichen Anleitungen empfohlen, müssen Sie die Einstellungen anpassen, um SSL-Verkehr zuzulassen. Glücklicherweise registriert Nginx bei der Installation einige Profile mitufw.

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
  OpenSSH

Sie können 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
--                         ------      ----
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)

[[Schritt-4 -–- Aktivieren-der-Änderungen-in-Nginx]] == 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
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

[[Schritt 5 - Testen der Verschlüsselung]] == Schritt 5 - Testen der Verschlüsselung

Jetzt können Sie Ihren SSL-Server testen.

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

https://server_domain_or_IP

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:

Nginx self-signed cert warning

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 trotzdem zu Ihrem Host zu gelangen:

Nginx self-signed override

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://server_domain_or_IP

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

[[Schritt-6 -–- Ändern zu einer permanenten Weiterleitung]] == Schritt 6 - Wechseln zu einer permanenten Weiterleitung

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/example.com

Suchen Sie diereturn 302 und ändern Sie sie inreturn 301:

/etc/nginx/sites-available/example.com

    return 301 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.