GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So sichern Sie Nginx mit dem Let’s Encrypt SSL-Zertifikat

Let’s Encrypt ist eine kostenlose, quelloffene und automatisierte Zertifizierungsstelle (CA), die von der Internet Security Research Group (ISRG) entwickelt wurde und SSL/TLS-Zertifikate anbietet, um die Kommunikation zwischen zwei Parteien zu verschlüsseln.

Ein SSL-Zertifikat in Ihrer Website erhöht nicht nur die Sicherheit Ihrer Website durch Verschlüsselung, sondern verbessert auch das SEO-Ranking Ihrer Website, da Google die Einbindung eines SSL-Zertifikats für ein besseres SEO-Ranking zwingend vorgeschrieben hat.

In diesem Artikel untersuchen wir, wie man einen NGINX-Server mit Let’s Encrypt SSL-Zertifikat in Ubuntu 18.04 sichert.

Voraussetzungen

  • Sie haben die Berechtigung, eine SSH-Sitzung auf dem Ubuntu 18.04-Server zu öffnen, indem Sie entweder einen Root-Benutzer oder einen sudo-aktivierten Benutzer verwenden.
  • Sie haben NGINX bereits installiert, indem Sie unserem Tutorial von hier aus folgen.
  • Ein registrierter Domänenname.
  • DNS Ein Datensatz, der basierend auf dem Domainnamen, den Sie verwenden möchten, auf die IP-Adresse Ihres Servers verweist.
Dieses Tutorial erfordert die Verwendung von Domänennamen. Wann immer Sie entweder die SUBDOMAIN-, DOMAIN- oder TLD-Variablen sehen, ersetzen Sie sie durch Ihre eigenen Werte.

Installieren Sie die Let’s Encrypt Client-Bibliothek

Der allererste Schritt, den Sie ausführen müssen, ist die Installation der Let’s Encrypt-Client-Bibliothek, die wiederum verwendet wird, um Zertifikate von der LE-Autorität anzufordern. Eine Möglichkeit, dies zu tun, besteht darin, die Client-Bibliothek von Let’s Encrypt aus ihrem offiziellen Repository auf Ihrem Server zu klonen.

Es ist auch möglich, dasselbe aus dem offiziellen Repository von Ubuntu zu installieren. Im Ubuntu-Repository ist die Client-Bibliothek als certbot bekannt bereitgestellt von Let’s Encrypt-Entwicklern. Aber wir werden die erstere Installationsmethode wählen, d. h. durch Klonen des Github-Repositorys von Let’s Encrypt.

Navigieren Sie dazu zu Ihrem ausgewählten Installationsordner und klonen Sie das Repository. Als Installationsordner habe ich /usr/local gewählt , können Sie je nach Umgebung einen anderen Ordner auswählen.


# apt-get install git
# cd /usr/local
# git clone https://github.com/letsencrypt/letsencrypt

Wechseln Sie in den Ordner letsencrypt, dort finden Sie alle geklonten Ordner und Dateien, einschließlich certbot, die von Let’s encrypt benötigt werden, um Zertifikate für Sie abzurufen.

Listen Sie den Lets Encrypt-Ordner auf

Konfigurieren Sie Let’s Encrypt, um Ihre Domain zu verifizieren

Beim Abrufen eines Zertifikats erstellt der Let’s Encrypt-Client eine temporäre Datei in .well-known/acme-challenge Mappe. Diese Datei enthält ein Token, um zu bestätigen, dass Sie tatsächlich Eigentümer der Domain sind, für die Sie versuchen, die Zertifikate abzurufen. Denken Sie daran, dass der besagte Ordner unter das Webstammverzeichnis der Domain fällt.

Daher ist es zwingend erforderlich, dass Let’s Encrypt auf die temporäre Datei zugreifen kann, um die Domäne zu verifizieren. Um Zugriff zu gewähren, müssen Sie NGINX konfigurieren, da es der Eigentümer des Webstammverzeichnisses für die Domäne ist. Fügen Sie einen Standortblock speziell für den Ordner /.well-known/acme-challenge hinzu Dadurch kann Let’s Encrypt ein Token für die Domänenverifizierung platzieren. Bearbeiten Sie dazu die NGINX-Konfigurationsdatei für Ihren virtuellen Host. Vergessen Sie nicht, den Stammordner an Ihre Umgebung anzupassen.



    server {
            listen 80;
            server_name SUBDOMAIN.DOMAIN.TLD;
            root /var/www/html/wordpress;
            ...
            ...
            ...
            location /.well-known/acme-challenge {
               allow all; 
               default_type "text/plain";
            }
           ...
           ...
    }

Überprüfen Sie, ob die Konfigurationsdatei syntaktisch korrekt ist, und starten Sie NGINX neu:


# nginx -t 
# systemctl restart nginx

UFW-Firewall konfigurieren

Ubuntu 18.04 wird mit einem Standard-Firewall-Manager UFW ausgeliefert, und wenn Sie ihn bereits aktiviert haben und auf Ihrem Server ausgeführt werden, dürfen keine HTTP- oder HTTPS-Verbindungen den NGINX-Server erreichen.

Es ist auch möglich, dass Sie versuchen, Zertifikate auf einem zuvor konfigurierten Server zu installieren, und die Firewall-Regeln bereits vorhanden sind. Natürlich können Sie die Firewall-Regeln mit ufw status auflisten Befehl in Ihrem Server, bevor Sie mit der Aktivierung von HTTP- und HTTPS-Verbindungen auf Ihrem Ubuntu 18.04-Server fortfahren.

Führen Sie die folgenden Befehle im Terminal aus, um HTTP- und HTTPS-Verbindungen auf Ihrem Server zuzulassen.


# ufw status
# ufw allow http
# ufw allow https
# ufw reload

SSL-Zertifikat von Let’s Encrypt anfordern

Lassen Sie uns ein SSL-Zertifikat für die ausgewählte Domain mit dem zuvor geklonten Let’s Encrypt-Client anfordern. Obwohl viele Konfigurationsoptionen verfügbar sind, die man mit dem Let’s Encrypt-Skript verwenden kann, während man ein Zertifikat anfordert, werden wir nur die folgenden Optionen verwenden.

  1. sicher :Diese Option weist das letsencrypt-Skript an, nur das SSL-Zertifikat zu erhalten. Wir werden die Konfiguration von NGINX später manuell vornehmen.
  2. Webroot :Diese Option gibt das Webroot-Plug-in an, das bei der Validierung des Domainnamens verwendet werden soll.
  3. Webroot-Pfad :Diese Option legt den Stamm der Domain fest und muss auf den Standort der Website verweisen, den Sie in der NGINX-Konfiguration konfiguriert haben.
  4. stimme zu :Bedeutet, den Nutzungsbedingungen von Let’s Encrypt zuzustimmen.
  5. E-Mail :Die E-Mail wird verwendet, um eine Ablaufbenachrichtigung von Let’s Encrypt zu erhalten, kann aber auch verwendet werden, um den verlorenen Schlüssel wiederherzustellen.
  6. d :Diese Option gibt den Domänennamen an, für den ein Zertifikat angefordert wird.

Kombinieren Sie nun die obigen Optionen zusammen mit dem letsencrypt-Client-Skript und fordern Sie ein Zertifikat mit den folgenden Befehlen an:


# cd /usr/local/letsencrypt
# ./letsencrypt-auto certonly --agree-tos --email [email protected] --webroot --webroot-path /var/www/html/wordpress -d SUBDOMAIN.DOMAIN.TLD

Lets Encrypt-Zertifikat erfolgreich abgerufen

Das Let’s Encrypt-Skript zeigt Ihnen einen kleinen Hinweis, sobald die SSL-Zertifikate erfolgreich abgerufen wurden, und die Zertifikate werden in /etc/letsencrypt/live gespeichert Ordner.

Konfigurieren Sie NGINX für das Let’s Encrypt SSL-Zertifikat

Zu diesem Zeitpunkt wurde die Zertifikatskette von Let’s Encrypt erfolgreich auf Ihrem Server gespeichert. Fahren Sie nun mit der Konfiguration der virtuellen Hostdatei für einen gesicherten SSL-fähigen NGINX-Webserver fort.

Diffie-Hellman-Schlüssel generieren

Obwohl die Verwendung des Diffie-Hellman-Schlüssels bei der Konfiguration von Let’s Encrypt-Zertifikaten mit NGINX optional ist, wird er hauptsächlich als Methode zum sicheren Austausch von Kryptografieschlüsseln zur Verwendung im Let’s-Encrypt-Zertifikat verwendet.


# mkdir -p /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096

Ich habe die DH-Parameterdatei in /etc/nginx/ssl abgelegt Verzeichnis einfach der Bequemlichkeit halber. Sie können die Datei an einem anderen Ort ablegen.

SSL-Parameter konfigurieren

Fügen Sie als Nächstes Parameter für die SSL-Verbindung wie Protokollversionen, Cipher Suites, Sitzungen und Header hinzu, die Ihr Server in einer separaten Datei unterstützen sollte.

Dadurch wird eine starke Cipher Suite eingerichtet, die Forward Secrecy wann immer möglich ermöglicht. Darüber hinaus werden wir HSTS und HPKP in die Lage versetzen, den NGINX-Server für SSL-Verbindungen zu härten. Dadurch wird eine starke und zukunftssichere SSL-Konfiguration ermöglicht, die beim SSL-Test von Qualys Labs die Note A+ erhält .


# vi /etc/nginx/conf.d/ssl.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
#Online Certificate Status Protocol Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_tickets off;
#HTTP Strict Transport Security
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_trusted_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header X-Robots-Tag none;

Virtuellen NGINX-Host bearbeiten

Bearbeiten Sie abschließend die NGINX-Serverblöcke für Ihre ausgewählte Domain. Navigieren Sie zum Standardspeicherort für NGINX-Serverblöcke, der /etc/nginx/sites-available ist und bearbeiten Sie die virtuelle NGINX-Hostdatei.


# vi /etc/nginx/sites-available/your_nginx_file.conf

server {
         listen 80;
         listen [::]:80;
         server_name SUBDOMAIN.DOMAIN.TLD;
         return 301 https://$host$request_uri;
}
...
...

Der obige Serverblock weist NGINX an, auf jede eingehende Anfrage in Port 80 für die Domain SUBDOMAIN.DOMAIN.TLD zu lauschen und leiten Sie dasselbe zum https-Abschnitt um, dessen Konfiguration unten angegeben ist.


...
...
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        root   /var/www/html/wordpress;
        index index.html index.php index.htm;

        server_name  SUBDOMAIN.DOMAIN.TLD;
        error_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-error.log debug;
        access_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-access.log;

        ssl_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/privkey.pem;

        include /etc/nginx/conf.d/ssl.conf;

        location /.well-known/acme-challenge {
               allow all;
               default_type "text/plain";
        }

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

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

Überprüfen Sie die Konfigurationsdatei auf syntaktische Fehler:


# nginx -t 

Um den Serverblock zu aktivieren, erstellen Sie einen symbolischen Link der obigen Konfigurationsdatei des virtuellen Hosts in /etc/nginx/sites-enabled Ordner.


# cd /etc/nginx/sites-enabled
# ln -s ../sites-available/your_nginx_file.conf .

NGINX neu laden, um neue Einstellungen zu übernehmen:


# systemctl reload nginx

Um die Konfiguration der obigen SSL-Einstellungen zu analysieren, richten Sie Ihren Browser auf SSL Labs Test und geben Sie Ihren Domänennamen ein und klicken Sie auf „Senden“. Warten Sie eine Minute, um die Zusammenfassung des Tests anzuzeigen. Eine Bewertung von A+ bedeutet, dass wir die meisten SSL-Optionen in den Prozess der Sicherung des NGINX-Servers einbezogen haben.

Automatische Erneuerung des Let’s Encrypt-Zertifikats

Die Zertifikate von Let’s Encrypt sind 90 Tage gültig. Der Grund dafür ist, den Schaden durch die Kompromittierung von Schlüsseln zu begrenzen und die Automatisierung zu fördern.

Um den Prozess der Zertifikatserneuerung zu automatisieren, erstellen Sie einen Cronjob mit crontab und fügen Sie eine Skriptzeile hinzu, die einmal pro Woche ausgeführt wird, um die Zertifikate zu erneuern, wenn sie kurz vor dem Ablauf stehen.


# crontab -e
45 4 * * 6 cd /usr/local/letsencrypt/ && ./certbot-auto renew && systemctl restart nginx

Das obige einzeilige Skript wird jeden Samstag ausgeführt, um zu prüfen, ob Zertifikate zur Erneuerung anstehen, und wenn dies der Fall ist, werden die Zertifikate erneuert, gefolgt von einem Neustart des NGINX-Servers.

Beachten Sie, dass es nicht vollständig optimiert ist, da der NGINX-Server neu gestartet wird, auch wenn das Zertifikat nicht erneuert wird. Die beste Option wäre, ein benutzerdefiniertes Skript zu schreiben, um das SSL-Zertifikat zu erneuern und den NGINX-Server neu zu starten, wenn die Zertifikate tatsächlich erneuert werden.

Schlussfolgerung

In diesem Artikel haben wir gelernt, wie Sie die Client-Bibliothek von Let’s Encrypt installieren, ein Zertifikat für Ihre Domain anfordern und wie Sie SSL-Zertifikate von Let’s Encrypt mit NGINX konfigurieren. Außerdem zeigt Ihnen ein Beispiel-Cronjob, wie Sie sich regelmäßig um den Zertifikaterneuerungsprozess kümmern.


Linux
  1. So sichern Sie ein cPanel-fähiges Konto mit einem SSL-Zertifikat von Lets Encrypt

  2. Sichern Sie Nginx mit Let’s Encrypt SSL auf Debian 10/11

  3. So sichern Sie Nginx mit SSL und Let’s Encrypt in FreeBSD

  4. So richten Sie WSO2 mit dem Let’s Encrypt-Zertifikat ein

  5. So erhalten Sie ein kostenloses SSL-Zertifikat mit SSL It! und Let’s Encrypt auf Plesk

So installieren Sie Let’s Encrypt SSL mit Nginx unter Ubuntu 16.04 LTS

So sichern Sie einen Plesk-Hostnamen mit SSL

Sichern Sie Nginx mit Let’s Encrypt SSL-Zertifikat auf Ubuntu 18.04

So sichern Sie den LEMP-Server mit Let’s Encrypt Free SSL auf Ubuntu 18.04 VPS

So sichern Sie Nginx mit Let’s Encrypt unter CentOS 8

So sichern Sie Nginx mit Let’s Encrypt unter Ubuntu 20.04