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

So richten Sie mit Nginx mehrere SSLs auf einer IP ein

Mit dem Mangel an verfügbarem Adressraum in IPv4 werden IPs immer schwieriger zu bekommen und in einigen Fällen immer teurer. In den meisten Fällen ist dies jedoch kein Nachteil. Server sind perfekt in der Lage, mehrere Websites unter einer IP-Adresse zu hosten, wie sie es seit Jahren tun.

Es gab jedoch eine Zeit, in der die Verwendung eines SSL-Zertifikats zum Sichern des Datenverkehrs zu Ihrer Website erforderlich war mit einer separaten IPv4-Adresse für jede gesicherte Domäne. Dies liegt nicht daran, dass SSLs an IPs oder sogar an Server gebunden waren, sondern daran, dass die Anfrage nach SSL-Zertifikatsinformationen nicht angab, welche Domain geladen wurde, und der Server daher gezwungen war, mit nur einem Zertifikat zu antworten. Ein Namenskonflikt verursachte eine Warnung wegen eines unsicheren Zertifikats, und daher musste ein Serverbesitzer eindeutige IPs für alle SSL-Hosts haben.

Glücklicherweise haben IPv4-Einschränkungen neue Technologien und Benutzerfreundlichkeit in den Vordergrund gerückt, insbesondere Server Name Indication (SNI).

Warum brauche ich SSL?

SSL-Zertifikate (Secure Socket Layer) ermöglichen eine bidirektionale verschlüsselte Kommunikation zwischen einem Client und einem Server. Dies ermöglicht jeglichen Datenschutz vor neugierigen Blicken, einschließlich sensibler Informationen wie Kreditkartennummern oder Passwörter. SSLs werden optional von einer bekannten Signaturstelle eines Drittanbieters wie GlobalSign signiert. Die häufigste Verwendung solcher Zertifikate ist die Sicherung des Webdatenverkehrs über HTTPS.

Beim Surfen auf einer HTTPS-Website zeigen moderne Browser statt eines positiven Indikators ein negatives an Indikator für eine Site, die nicht ist unter Verwendung eines SSL. Websites, die kein SSL haben, haben also sofort eine rote Flagge für alle neuen Besucher. Websites, die ihren guten Ruf wahren wollen, sind daher gezwungen, sich ein SSL zu besorgen.

Glücklicherweise ist es so einfach, ein SSL zu bekommen und zu installieren, sogar kostenlos, dass dies auf eine grundlegende Formalität reduziert wird. Wir werden die Einzelheiten dazu weiter unten behandeln.

Was ist SNI?

Server Name Indication ist eine Browser- und Webserverfunktion, bei der eine HTTPS-Anforderung einen zusätzlichen Header enthält, server_name , auf die der Server mit dem entsprechenden SSL-Zertifikat antworten kann. Dadurch kann eine einzige IP-Adresse Hunderte oder Tausende von Domains hosten, jede mit ihrem eigenen SSL!

Die SNI-Technologie ist in allen modernen Browsern und Webserversoftware verfügbar, sodass laut W3 mehr als 98 % der Webbenutzer sie unterstützen können.

Check vor dem Flug

Wir werden an einem CentOS 7 VPS-Server arbeiten, der Nginx und PHP-FPM verwendet, um Websites ohne Control Panel (cPanel, Plesk usw.) zu hosten. Dies wird allgemein als „LEMP“-Stack bezeichnet, der Apache im „LAMP“-Stack durch Nginx ersetzt. Diese Anweisungen ähneln den meisten anderen Linux-Varianten, obwohl die Installation von Let’s Encrypt für Ubuntu 18.04 anders sein wird. Ich füge parallele Anweisungen für CentOS 7 und Ubuntu 18.04 hinzu.

Für die restlichen Anweisungen gehen wir davon aus, dass Sie Nginx installiert und eingerichtet haben, um mehrere Websites zu hosten, einschließlich der Firewall-Konfiguration zum Öffnen der erforderlichen Ports (80 und 443). Wir sind über SSH mit einer Shell auf unserem Server als root verbunden.

HinweisWenn Sie SSLs für jede Domäne haben, diese aber noch nicht installiert sind, sollten Sie Schritt 3a verwenden um sie manuell hinzuzufügen. Wenn Sie keine SSLs haben und den kostenlosen Dienst Let’s Encrypt nutzen möchten, um diese zu bestellen und automatisch zu konfigurieren, sollten Sie Schritt 3b verwenden .

Schritt 1:SNI in Nginx aktivieren

Unser erster Schritt ist bereits abgeschlossen! Moderne Repository-Versionen von Nginx werden standardmäßig mit OpenSSL-Unterstützung zum Servern von SNI-Informationen kompiliert. Wir können dies auf der Kommandozeile bestätigen mit:

nginx -V

Dies wird eine Menge Text ausgeben, aber wir interessieren uns nur für diese Zeile:

...
TLS SNI support enabled
...

Wenn Sie keine Zeile wie diese haben, muss Nginx manuell neu kompiliert werden, um diese Unterstützung einzuschließen. Dies wäre ein sehr seltener Fall, z. B. in einer veralteten Version von Nginx, die bereits manuell aus dem Quellcode mit einer anderen OpenSSL-Bibliothek kompiliert wurde. Die vom CentOS 7 EPEL-Repository (1.12.2) installierte Nginx-Version und die in Ubuntu 18.04 (1.14.0) enthaltene Version unterstützen SNI.

Schritt 2:Virtuelle Nginx-Hosts konfigurieren

Da Sie bereits mehr als eine Domain in Nginx eingerichtet haben, haben Sie wahrscheinlich Serverkonfigurationsblöcke für jede Site in einer separaten Datei eingerichtet. Für den Fall, dass dies nicht der Fall ist, stellen wir zunächst sicher, dass unsere Domains für Nicht-SSL-Datenverkehr eingerichtet sind. Wenn dies der Fall ist, können Sie diesen Schritt überspringen. Wir arbeiten an domain.com und example.com.

vim /etc/nginx/sites-available/domain.com

HinweisWenn Sie keine Ordner mit aktivierten oder verfügbaren Sites haben und diese verwenden möchten, können Sie /etc/nginx/sites-available erstellen und /etc/nginx/sites-enabled mit dem mkdir Befehl. Danach in /etc/nginx/nginx.conf , fügen Sie diese Zeile irgendwo innerhalb des Haupt-http{} hinzu block (wir empfehlen, ihn direkt hinter die Include-Zeile zu setzen, die über conf.d spricht):

include /etc/nginx/sites-enabled/*;

Andernfalls können Sie Ihre Konfigurationen in /etc/nginx/conf.d/*.conf vornehmen .

Fügen Sie zumindest die folgenden Optionen ein, ersetzen Sie den Dokumentenstamm durch den tatsächlichen Pfad zu Ihren Site-Dateien und fügen Sie alle anderen Variablen hinzu, die Sie für Ihre Sites benötigen:

server {
listen 80;
server_name domain.com;
root /var/www/domain.com;
...
}

Eine ähnliche Datei sollte für example.com und alle anderen Domains, die Sie hosten möchten, eingerichtet werden. Sobald diese Dateien erstellt sind, können wir sie mit einem symbolischen Link aktivieren:

ln -s /etc/nginx/sites-available/domain.com /etc/nginx/sites-enabled/

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Jetzt starten wir Nginx neu…

systemctl reload nginx

Dadurch werden die Konfigurationsdateien neu geladen, ohne die Anwendung neu zu starten. Wir können bestätigen, dass die beiden, die wir gerade erstellt haben, geladen werden mit:

nginx -T

Sie sollten Ihren server_name sehen Zeile für domain.com und example.com.

HinweisDie hören Zeile, die im obigen Serverblock enthalten ist, ermöglicht es der Website, auf jedem zu lauschen IP, die auf dem Server liegt. Wenn Sie stattdessen eine IP angeben möchten, können Sie den IP:Port verwenden stattdessen wie folgt formatieren:

server {
listen 123.45.67.89:80;
...
}

Schritt 3a:Vorhandene SSLs zu virtuellen Nginx-Hosts hinzufügen

Jetzt, da wir gültige laufende Konfigurationen haben, können wir die SSLs, die wir für diese Domains haben, als neue Serverblöcke in Nginx hinzufügen. Speichern Sie zunächst Ihr SSL-Zertifikat und den (privaten) Schlüssel in einem globalen Ordner auf dem Server, dessen Namen auf die entsprechende Domäne hinweisen. Angenommen, Sie haben den globalen Ordner /etc/ssl/ ausgewählt . Unsere Namen lauten in diesem Fall /etc/ssl/domain.com.crt (das das Zertifikat selbst und alle Kettenzertifikate von der Signaturstelle enthält) und /etc/ssl/domain.com.key , die den privaten Schlüssel enthält. Bearbeiten Sie die von uns erstellten Konfigurationsdateien:

vim /etc/nginx/sites-available/domain.com

Fügen Sie einen brandneuen Serverblock unter dem Ende des vorhandenen (außerhalb der letzten geschweiften Klammer) mit den folgenden Informationen hinzu:

server {
listen 443;
server_name domain.com;
root /var/www/domain.com;
ssl_certificate /etc/ssl/domain.com.crt;
ssl_certificate_key /etc/ssl/domain.com.key;
...
}

Beachten Sie die Änderung des Listening-Ports auf 443 (für HTTPS) und das Hinzufügen des ssl_certificate und ssl_certificate_key Linien. Anstatt den gesamten Block neu zu schreiben, könnten Sie den ursprünglichen Serverblock kopieren und dann diese zusätzlichen Zeilen hinzufügen, während Sie den Listen-Port ändern. Speichern Sie diese Datei und laden Sie die Nginx-Konfiguration neu.

systemctl reload nginx

Wir bestätigen die Änderung erneut mit:

nginx -T

Bei einigen Setups sehen Sie zwei server_name-Zeilen jeweils für domain.com und example.com, eine mit Port 80 und eine mit Port 443. Wenn Sie dies tun, können Sie mit Schritt 4 fortfahren, andernfalls fahren Sie mit dem nächsten Schritt fort.

Schritt 3b:Let’s Encrypt installieren und konfigurieren

Als nächstes richten wir den kostenlosen SSL-Anbieter Let’s Encrypt ein, um Zertifikate für alle Domains, die wir gerade in Nginx eingerichtet haben, automatisch zu signieren. Auf Ubuntu 18.04 , fügen Sie das PPA hinzu und installieren Sie die Zertifikatskripte mit apt höhe:

add-apt-repository ppa:certbot/certbot

apt-get update

apt-get install certbot python-certbot-nginx

In CentOS 7 , installieren wir das EPEL-Repository und installieren von dort aus den Zertifikatshelfer.

yum install epel-release

yum install certbot python2-certbot-nginx

Auf beiden Systemen können wir nun die Nginx-Konfiguration auslesen und den Certbot bitten, uns einige Zertifikate zuzuweisen.

certbot --nginx

Dadurch werden Ihnen einige Fragen dazu gestellt, welche Domains Sie verwenden möchten (Sie können die Option leer lassen, um alle Domains auszuwählen) und ob Sie möchten, dass Nginx den Datenverkehr auf Ihr neues SSL umleitet (wir würden!). Nachdem der Signiervorgang abgeschlossen ist, sollte Nginx seine Konfiguration automatisch neu laden, aber falls dies nicht der Fall ist, laden Sie sie manuell neu:

systemctl reload nginx

Sie können nun die laufende Konfiguration überprüfen mit:

nginx -T

Sie sollten jetzt stattdessen zwei sehen server_name-Zeilen jeweils für domain.com und example.com, eine mit Port 80 und eine mit Port 443.

Let’s Encrypt-Zertifikate sind nur 90 Tage ab Ausstellung gültig, daher möchten wir sicherstellen, dass sie automatisch verlängert werden. Bearbeiten Sie die Cron-Datei für den Root-Benutzer, indem Sie Folgendes ausführen:

crontab -e

Der Cron sollte so aussehen:

45 2 * * 3,6 certbot renew && systemctl reload nginx

Sobald Sie diese Datei gespeichert haben, wird jeden Mittwoch und Samstag um 2:45 Uhr der certbot Der Befehl prüft auf erforderliche Verlängerungen, lädt die Zertifikate automatisch herunter und installiert sie, gefolgt von einem Neuladen der Nginx-Konfiguration.

Schritt 4:Installation und Gültigkeit überprüfen

Wir sollten jetzt die Gültigkeit unserer SSLs überprüfen und sicherstellen, dass Browser das Zertifikat richtig sehen. Besuchen Sie sslcheck.liquidweb.com und geben Sie Ihre Domainnamen ein, um das SSL der Website auf Ihrem Server zu überprüfen. Sie sollten vier grüne Häkchen sehen, die SSL-Schutz anzeigen.

Wir hoffen, dass Ihnen unser Tutorial zur Installation von SSLs auf mehreren Websites innerhalb eines Servers gefallen hat. Liquid Web-Kunden haben rund um die Uhr Zugang zu unserem Support-Team. Wir können mit signiertem SSL helfen oder einen neuen Server für eine einfache Übertragung zu Liquid Web bestellen.


Linux
  1. So konfigurieren Sie mehrere Websites mit dem Apache-Webserver

  2. So konfigurieren Sie Ursprungs-Cloudflare-SSL mit Nginx

  3. So richten Sie mehrere SSL-Zertifikate auf einem CentOS VPS mit Apache unter Verwendung einer IP-Adresse ein

  4. So installieren Sie Let’s Encrypt SSL auf Ubuntu 18.04 mit Nginx

  5. So richten Sie einen Linux-Server als Router mit NAT ein

So richten Sie Nginx mit HTTP/2-Unterstützung unter Ubuntu 18.04 ein

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

So richten Sie die Zeitsynchronisierung mit NTP unter Ubuntu 18.04 ein

So richten Sie einen Seafile-Server mit Nginx unter Ubuntu 18.04 ein

So richten Sie einen FTP-Server mit ProFTPD in Ubuntu 18.04 ein

So richten Sie einen Mailserver mit Modoboa unter Ubuntu 20.04 ein