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

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 16.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 16.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 16.04 folgen.

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

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

Schritt 1: Erstellen Sie das SSL-Zertifikat

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/ssl/certs/dhparam.pem 2048

Dies kann einige Minuten dauern, aber wenn dies erledigt ist, haben Sie eine starke DH-Gruppe bei/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 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 Sie ein Konfigurations-Snippet, 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 nur die Direktivessl_certificate auf unsere Zertifikatdatei undssl_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 vonRemy van Elst auf der Site vonCipherli.st. Diese Website wurde entwickelt, um benutzerfreundliche Verschlüsselungseinstellungen für gängige Software bereitzustellen. Sie können mehr über seine Entscheidungen bezüglich der Nginx-Auswahlhere lesen.

[.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. Wir werden auch die Einstellungssl_dhparamo einstellen, dass sie auf die zuvor generierte Diffie-Hellman-Datei verweist.

Schließlich 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. 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 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

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 Serverblockdateidefaultim Verzeichnis/etc/nginx/sites-availableverwenden. Wenn Sie eine andere Server-Blockdatei 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 erstenlisten-Direktiven fügen wir eineserver_name-Richtlinie hinzu, die auf den Domänennamen oder wahrscheinlich die IP-Adresse Ihres Servers festgelegt ist. Wir richten dann eine Umleitung zum zweiten Serverblock ein, den wir erstellen. Anschließend schließen wir diesen kurzen Block:

[.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.
#

/etc/nginx/sites-available/default

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

    # 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 zweilisten-Direktiven, die Port 443 verwenden, auskommentieren. Wir können diesen Zeilenhttp2 hinzufügen, um HTTP / 2 in diesem Block zu aktivieren. Danach müssen wir nur noch die zwei Snippet-Dateien einfügen, die wir erstellt haben:

[.note] #Note: Möglicherweise haben Sie nur die Direktiveonelisten, die den Modifikatordefault_server für jede Kombination aus IP-Version und Port enthält. Wenn für diese Ports andere Serverblöcke aktiviert sind, für diedefault_server festgelegt ist, müssen Sie den Modifikator aus einem der Blöcke entfernen.
#

/etc/nginx/sites-available/default

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

server {

    # SSL configuration

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

    . . .

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;
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;

    server_name server_domain_or_IP;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

    . . .

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

Schritt 3: Passen Sie die Firewall an

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 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

Schritt 5: Testen Sie die 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: 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 diereturn 302 und ändern Sie sie inreturn 301:

/etc/nginx/sites-available/default

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain_or_IP;
    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.

Related