So konfigurieren Sie https für Nginx in Docker

So konfigurieren Sie https für Nginx in Docker

Websites ohne https-Unterstützung werden von Browsern nach und nach als unsicher markiert. Daher ist es dringend erforderlich, Websites mit https zu ergänzen. Für kommerzielle Websites ist es kein Problem, Geld für SSL/TLS-Zertifikate auszugeben. Für Einzelnutzer wäre es allerdings ein Segen, wenn kostenlose SSL/TLS-Zertifikate zur Verfügung stünden! Let’s Encrypt ist eine Website, die kostenlose SSL/TLS-Zertifikate bereitstellt. Da das Zertifikat nur drei Monate gültig ist, müssen wir es automatisch erneuern. In diesem Artikel wird erläutert, wie Sie der über Docker ausgeführten Site in Nginx HTTPS-Unterstützung hinzufügen und die Zertifikatserneuerung automatisch abschließen. Die Demonstrationsumgebung dieses Artikels ist: Ubuntu 16.04-Host, der auf Azure ausgeführt wird (dieses Bild stammt aus dem Internet):

Vorbereiten der Umgebung

Es ist sehr einfach, eine virtuelle Ubuntu-Maschine auf Azure zu erstellen und auch die Installation von Docker ist ein Kinderspiel. Was oft übersehen wird, ist die Konfiguration geeigneter Netzwerksicherheitsgruppenregeln, wie etwa das Öffnen der Ports 80 und 443:

Außerdem gibt es noch die Konfiguration des DNS:

Erstellen Sie eine normale HTTP-Site

Der Einfachheit halber verwenden wir eine Node.JS-Anwendung in einem Spiegel als Website:

$ docker pull ljfpower/nodedemo
$ Docker-Netzwerk erstellen -d Bridge Webnet
$ docker run -d --restart=immer --expose=3000 \
   --network=webnet --name=meinweb \
   ljfpower/nodedemo

Erstellen Sie das Verzeichnis nginx und seine Unterverzeichnisse conf.d, conf.crt und html im Stammverzeichnis des Benutzers und erstellen Sie das Verzeichnis logs und seine Unterverzeichnisse nginx und letsencrypt:

$ mkdir -p nginx/{conf.d,conf.crt,html}
$ mkdir -p Protokolle/{nginx,letsencrypt}

Beachten Sie, dass wir in den in diesem Artikel gezeigten Beispielen die folgenden Dateien und Verzeichnisstrukturen manuell erstellen müssen:

Erstellen Sie die Datei nginx/nginx.conf mit folgendem Inhalt:

Benutzer nginx;
Arbeiterprozesse automatisch;

Fehlerprotokoll /var/log/nginx/error.log warnen;
pid /var/run/nginx.pid;

Ereignisse {
 Arbeiterverbindungen 2048;
}

http {
 /etc/nginx/mime.types einschließen;
 Standardtyp Anwendung/Oktett-Stream;

 sendfile an;
 KeepAlive-Timeout 65;
 Maximale Client-Körpergröße: 10 M;

 schließen Sie /etc/nginx/conf.d/*.conf ein;
}

Erstellen Sie dann die Datei nginx/conf.d/default.conf mit folgendem Inhalt:

Upstream-Web{
 Server myweb:3000;
}
Server {
 hören Sie 80;
 hören [::]:80;
 Servername filterinto.com www.filterinto.com;

 Standort ^~ /.well-known/acme-challenge/ {
  Standardtyp "Text/Plain";
  root /usr/share/nginx/html;
 }
 Standort = /.well-known/acme-challenge/ {
  Rückgabe 404;
 }
 Standort / {
  Proxy-Passwort http://Web;
 }
}

Das Verzeichnis /.well-known/acme-challenge/ wird beim Generieren des Zertifikats vom Tool „Certbot“ erstellt. Erstellen Sie als nächstes die Datei nginx/html/index.html mit folgendem Inhalt:

<!DOCTYPE html>
<html>
<Kopf>
 <meta charset="utf-8" />
 <title>Site zur erstmaligen Zertifikatsausgabe von Let’s Encrypt</title>
</Kopf>
<Text>
 <h1>Hallo HTTPS!</h1>
 <p>
  Erstmals verwendete SSL-Zertifikate werden von Let's Encrypt's ausgestellt.
  Zertifikatbot.
 </p>
</body>
</html>

Diese Seite muss Certbot auch zum Generieren von Zertifikaten verwenden. Starten wir abschließend den Container (führen Sie den folgenden Befehl im Home-Verzeichnis des Benutzers aus):

$ docker run -d \
 -p 80:80 \
 -v $(pwd)/nginx/conf.d:/etc/nginx/conf.d:ro \
 -v $(pwd)/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
 -v $(pwd)/logs/nginx:/var/log/nginx \
 -v $(pwd)/nginx/html:/usr/share/nginx/html \
 --restart=immer \
 --name=Gateway \
 --network=webnet \
 nginx:1.14

Hinweis: Derzeit ist Port 443 nicht zugeordnet und das Verzeichnis, in dem die Zertifikate gespeichert sind, nicht bereitgestellt. Der Zugriff auf unsere Seite ist ausschließlich über http möglich:

Generieren Sie ein SSL/TLS-Zertifikat für Ihre Site

Let's Encrypt ist eine Website, die kostenlose SSL/TLS-Zertifikate bereitstellt. Sie stellt Benutzern das Tool Certbot zum Generieren von SSL/TLS-Zertifikaten zur Verfügung. Der Einfachheit halber kapseln wir certbot einfach in einen Container. Erstellen Sie ein Certbot-Verzeichnis im Home-Verzeichnis des Benutzers, wechseln Sie in das Certbot-Verzeichnis und speichern Sie den folgenden Inhalt in der Dockerfile-Datei:

VON alpin:3.4
Führen Sie den Befehl apk add --update bash certbot aus.
VOLUME ["/etc/letsencrypt"]

Führen Sie dann den folgenden Befehl aus, um das Certbot-Image zu erstellen:

$ docker build -t certbot:1.0 .

Anschließend erstellen Sie im certbot-Verzeichnis ein Skript namens renew_cert.sh, um das Zertifikat automatisch zu aktualisieren. Der Inhalt lautet wie folgt:

#!/bin/bash
WEBDIR="$1"
LIST=('filterinto.com' 'www.filterinto.com')
LED_LIST=()
WWW_ROOT=/usr/share/nginx/html
für Domäne in ${LIST[@]};do
 Docker-Ausführung \
  --rm \
  -v ${WEBDIR}/nginx/conf.crt:/etc/letsencrypt \
  -v ${WEBDIR}/logs/letsencrypt:/var/log/letsencrypt \
  -v ${WEBDIR}/nginx/html:${WWW_ROOT} \
  certbot:1.0 \
  certbot certonly --verbose --noninteractive --quiet --agree-tos \
  --webroot -w ${WWW_ROOT} \
  --email="[email protected]" \
  -d "$Domäne"
 CODE=$?
 wenn [ $CODE -ne 0 ]; dann
  FAILED_LIST+=($Domäne)
 fi
Erledigt

# fehlgeschlagene Domänen ausgeben
wenn [ ${#FAILED_LIST[@]} -ne 0 ];dann
 echo 'Domäne fehlerhaft:'
 für ((i=0;i<${#FAILED_LIST[@]}; i++));
 Tun
  echo ${FAILED_LIST[$i]}
 Erledigt
fi

Führen Sie den Befehl ./renew_cert.sh /home/nick im Home-Verzeichnis des Benutzers aus, um ein neues Zertifikat zu generieren (/home/nick ist das Home-Verzeichnis des aktuellen Benutzers). Das generierte Zertifikat wird im Verzeichnis /home/nick/nginx/conf.crt/live gespeichert. Das Zertifikat für den Domänennamen wird im nach dem Domänennamen benannten Verzeichnis gespeichert:

Überprüfen Sie dann das Verzeichnis nginx/html und suchen Sie nach einem versteckten .well-known-Verzeichnis. Dieses Verzeichnis wird erstellt, wenn das Zertifikat generiert wird:

Mit dem SSL/TLS-Zertifikat können wir dann die https-Site konfigurieren.

Konfigurieren Sie ein SSL/TLS-Zertifikat für Ihre Site

Mit dem SSL/TLS-Zertifikat besteht der nächste Schritt darin, die nginx-Konfigurationsdatei zu aktualisieren. Aktualisieren Sie den Inhalt von nginx/conf.d/default.conf wie folgt:

Upstream-Web{
 Server myweb:3000;
}

Server {
 hören Sie 80;
 hören [::]:80;
 Servername filterinto.com www.filterinto.com;

 Standort ^~ /.well-known/acme-challenge/ {
  Standardtyp "Text/Plain";
  root /usr/share/nginx/html;
 }
 Standort = /.well-known/acme-challenge/ {
  Rückgabe 404;
 }
 Rückgabewert 301 https://$server_name$request_uri;
}
Server {
 hören Sie 443;
 hören [::]:443;
 Servername filterinto.com;

 # SSL aktivieren
 SSL aktiviert;
 SSL-Protokolle TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers ein;
 ssl_ciphers „EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4“;

 # SSL-Zertifikat konfigurieren
 SSL-Zertifikat conf.crt/live/filterinto.com/fullchain.pem;
 ssl_certificate_key conf.crt/live/filterinto.com/privkey.pem;

 Standort ^~ /.well-known/acme-challenge/ {
  Standardtyp "Text/Plain";
  root /usr/share/nginx/html;
 }
 Standort = /.well-known/acme-challenge/ {
   Rückgabe 404;
 }
 Standort / {
  Proxy-Passwort http://Web;
 }
}
Server {
 hören Sie 443;
 hören [::]:443;
 Servername www.filterinto.com;

 # SSL aktivieren
 SSL aktiviert;
 SSL-Protokolle TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers ein;
 ssl_ciphers „EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4“;

 # SSL-Zertifikat konfigurieren
 SSL-Zertifikat conf.crt/live/www.filterinto.com/fullchain.pem;
 ssl_certificate_key conf.crt/live/www.filterinto.com/privkey.pem;

 Standort ^~ /.well-known/acme-challenge/ {
  Standardtyp "Text/Plain";
  root /usr/share/nginx/html;
 }
 Standort = /.well-known/acme-challenge/ {
   Rückgabe 404;
 }
 Standort / {
  Proxy-Passwort http://Web;
 }
}

Löschen Sie anschließend den Gateway-Container und erstellen Sie ihn mit dem folgenden Skript neu:

$ docker run -d \
 -p 80:80 \
 -p 443:443 \
 -v $(pwd)/nginx/conf.d:/etc/nginx/conf.d:ro \
 -v $(pwd)/nginx/conf.crt:/etc/nginx/conf.crt:ro \
 -v $(pwd)/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
 -v $(pwd)/logs/nginx:/var/log/nginx \
 -v $(pwd)/nginx/html:/usr/share/nginx/html \
 --restart=immer \
 --name=Gateway \
 --network=webnet \
 nginx:1.14

Ab sofort ist die Seite nur noch über https erreichbar:

Automatische Zertifikatserneuerung

Die Gültigkeitsdauer der von Let’s Encrypt bereitgestellten SSL/TLS-Zertifikate beträgt nur drei Monate. Es ist ziemlich schwierig, die Zertifikate alle drei Monate manuell zu erneuern. Hier stellen wir die Methode zur automatischen Erneuerung der Zertifikate vor.

Tatsächlich hat unsere Konfiguration den größten Komfort für die automatische Zertifikatserneuerung geboten (tatsächlich ist es der Komfort, der durch die Verwendung von Docker entsteht). Fügen Sie einfach die folgenden beiden Datensätze in die geplante Aufgabe ein:

0 0 1 * * /home/nick/certbot/renew_cert.sh /home/nick >> /home/nick/logs/cert.log 2>> /home/nick/logs/cert.error.log
0 1 1 * * Docker Exec Gateway nginx -s neu laden

Erneuern Sie das Zertifikat am 1. jedes Monats um 0:00 Uhr und laden Sie die Nginx-Konfiguration eine Stunde später neu.

Zusammenfassen

Let’s Encrypt ist eine großartige Website, die Anfängern und Einzelpersonen bei der einfachen (kostenlosen) Implementierung von HTTPS-Sites helfen kann! Dies ist zwar praktisch, birgt aber auch offensichtliche Gefahren: Da jeder problemlos ein SSL/TLS-Zertifikat erhalten kann, können illegale Websites es auch nutzen, um sich als legitime Websites auszugeben. Gehen Sie also nicht einfach davon aus, dass HTTPS-Sites sicher sind!

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • So installieren Sie Nginx in Docker und konfigurieren den Zugriff über https
  • So stellen Sie nginx mit Docker bereit und ändern die Konfigurationsdatei
  • nginx generiert automatisch Konfigurationsdateien im Docker-Container
  • So konfigurieren Sie nginx+php+mysql in Docker
  • So installieren und konfigurieren Sie Docker nginx
  • So führen Sie nginx in Docker aus und mounten das lokale Verzeichnis in das Image
  • Detailliertes Tutorial zur Konfiguration von Docker nginx + https-Subdomains

<<:  Reagieren Sie mit Beispielcode zur Implementierung des Anmeldeformulars

>>:  So löschen und deinstallieren Sie MySQL in Windows 10 vollständig

Artikel empfehlen

Ein tiefer Einblick in JavaScript-Promises

Inhaltsverzeichnis 1. Was ist Promise? 2. Warum g...

Zwei Möglichkeiten zum Einführen von SVG-Symbolen in Vue

So führen Sie SVG-Symbole in Vue ein Methode 1 zu...

Tutorial zur HTML-Tabellenauszeichnung (4): Rahmenfarbenattribut BORDERCOLOR

Um die Tabelle zu verschönern, können Sie untersc...

HTML-Hyperlink ein Tag_Powernode Java Academy

Jeder, der HTML studiert oder verwendet hat, soll...

Erläuterung von JavaScript-Mikrotasks und Makrotasks

Vorwort: js ist eine Single-Thread-Sprache, daher...

Beispiele für neue Selektoren in CSS3

Struktureller (Position) Pseudoklassenselektor (C...

Drei Möglichkeiten, doppeltes Einfügen von Daten in MySql zu vermeiden

Vorwort Im Falle eines Primärschlüsselkonflikts o...

Detaillierte Erläuterung der Verwendung der Vue3-Statusverwaltung

Inhaltsverzeichnis Hintergrund Bereitstellen / In...

Befehl zum Anzeigen der Erstellungszeit der Binlog-Datei unter Linux

Inhaltsverzeichnis Hintergrund analysieren Verfah...

Detaillierte Erklärung der Zeit- und Datumsverarbeitung von moment.js

Konvertierung des Zeitformats von Montag auf Sonn...

Einführung in die Vue-Schaltflächenberechtigungssteuerung

Inhaltsverzeichnis 1. Schritte 1. Definieren Sie ...