Inhaltsverzeichnis
Haftungsausschluss (gemäß den Kommentaren zum vorherigen Artikel)
Domainname
Als wir das letzte Mal im Docker-Container gelandet sind, wurde ein Webserver NGINX gestartet, der die statische Datei index.html verteilt. Dieses Mal werden wir die Funktionalität des Webservers erweitern, indem wir Datenverschlüsselung und erzwungene Weiterleitungen von http zu https hinzufügen.
Dazu müssen Sie ein organisatorisches Problem lösen: Tatsache ist, dass das Verschlüsselungszertifikat nur für einen Domainnamen oder eine Gruppe von Namen erhältlich ist. Aus diesem Grund gehen wir zu einem der Domainnamen-Registrare und wählen einen Namen, der der Marke entspricht (Zweck, Slogan usw.), ohne den Zweck von Top-Level- Domainnamen zu vergessen . In meinem Fall ist dartservice.ru perfekt . Während des Registrierungsprozesses müssen Sie das Eigentümerinformationsformular mit Name, Postanschrift und E-Mail-Adresse ausfüllen. Anschließend müssen Sie in der Systemsteuerung des Registrars zur Verwaltung der DNS-Einträge wechseln und drei Einträge erstellen:
- Mindestens zwei NS-Datensätze. Dies sind die Namen der Domain Name Server des Registrars und ihr Name wird vom Registrar beim Kauf eines Domainnamens angegeben.
- Ein Rekord. Dies ist direkt eine Aufzeichnung der Beziehung zwischen dem Domänennamen und der IP-Adresse des Servers.
In meinem Fall sehen DNS-Einträge folgendermaßen aus:
Wenn Sie dies getan haben, sollten Sie keine sofortigen Ergebnisse erwarten. Der Informationsaustausch zwischen DNS-Servern dauert in der RU-Zone normalerweise 1 bis 12 Stunden. Dann ... fügen Sie dem Projekt /test/http/client.http einen weiteren Test hinzu
SSL
Im Allgemeinen ist SSL natürlich ein veralteter Name. Die neuen Versionen des Protokolls heißen TLS 1.0 ... 1.3, aber der Mechanismus bleibt derselbe - Datenverschlüsselung während des Übergangs zwischen dem Anwendungsschichtprotokoll (in unserem Fall HTTP) und dem Transportschichtprotokoll (TCP / IP). In der Tat brauchen Sie:
- Beziehen Sie ein Verschlüsselungszertifikat von einer speziellen Zertifizierungsstelle, um den Besitz der entsprechenden Domain zu bestätigen.
- NGINX.
- .
- , http https.
Derzeit ist es allgemein anerkannt, kostenlose Zertifikate zu verwenden, die automatisch vom Let's-Verschlüsselungsdienst ausgestellt werden . Eine der Einschränkungen solcher Zertifikate ist die Gültigkeitsdauer. Nur 90 Tage. Danach muss das Zertifikat erneut eingeholt werden. Für das automatische (ohne menschliches Eingreifen) Erhalten von Zertifikaten wurden das ACME- Protokoll und -Anwendungen entwickelt , die regelmäßig Aktionen ausführen, um den Domänenbesitz zu bestätigen. Verschlüsseln empfiehlt die Verwendung der certbot- App . Es ist in Python geschrieben und erfordert die Installation eines eigenen Repositorys und von Python3. Daher verwenden wir einen Docker-Container mit Certbot , der aus der DockerHub-Registrierung installiert wurde . Wählen wir die neueste stabile Version von certbot / certbot aus: v1.5.0...
Lassen Sie uns nun den Mechanismus zum Abrufen eines Zertifikats mithilfe des ACME-Protokolls herausfinden:
- Beim ersten Start generiert Certbot einen privaten und einen öffentlichen Schlüssel und erstellt dann ein Domänenadministratorkonto im Let's-Verschlüsselungsdienst, wobei der öffentliche Schlüssel und die Domäneninformationen übertragen werden.
- Danach sendet Let's Encrypt eine Nachricht, die certbot mit einem privaten Schlüssel signieren und zurückgeben muss.
- ertbot muss eine spezielle Datei auf dem Server ablegen , die zum Lesen in dartservice.ru/.well-known/acme-challenge verfügbar ist , um den Besitz dieser Domain zu bestätigen.
- Certbot erstellt eine Zertifikatanforderung , sendet sie an Let's encrypt und erhält im Gegenzug ein Zertifikat für die Domain.
Fügen wir den Anwendungscontainer zu unserem Skript docker-compose.yaml hinzu :
Neuer Parameter hier Befehl : Hier ist der Befehl, der ausgeführt wird, nachdem der Container gestartet wurde . In diesem Fall nur (ein Zertifikat erhalten). Der Erhalt eines Zertifikats erfolgt online, dh es müssen mehrere Fragen konsequent beantwortet werden. Wenn Sie nach dem Befehl Flags übergeben, können Sie dies ohne menschliches Eingreifen tun: --webroot (Bestätigungsmethode) --webroot-path = / usr / share / nginx / html / letsencrypt (Pfad, in dem die Bestätigungsdateien für den Domänenbesitz abgelegt werden) --email admin @ email.com (Domain-Administrator-Mail) - Zustimmen(Akzeptieren Sie die Bedingungen der Lizenzvereinbarung.) --no-eff-email ( E-Mail nicht an Certbot-Entwickler melden) -d dartservice.ru (Liste der Domains).
Lassen Sie uns den NGINX-Container konfigurieren: Die
Änderungen hier bestehen darin, den https-Port (443) zu öffnen und die Ordner mit den SSL-Zertifikat- und Domänenbesitzbestätigungsdateien bereitzustellen.
Ein wichtiger Parameter ist der Diffie-Hellman-Schlüsselordner. Kurz gesagt: Dieser Schlüssel wird benötigt, um beim Herstellen einer Verbindung sicher Verschlüsselungsschlüssel zwischen dem Server und dem Client auszutauschen. Weitere Details hier .
Lassen Sie uns einen solchen Schlüssel generieren, aber wir werden mit dem folgenden Problem konfrontiert sein: Der Schlüssel wird vom openssl- Programm erstelltDies ist ein Linux-Konsolendienstprogramm, das auf unserem Windows-Computer wahrscheinlich nicht angezeigt wird. Die einfachste Lösung ist unseren Skript ausgeführt werden soll, gehen Sie auf die Web - Container - Konsole und einen Schlüssel dort erstellen, vorbei an den Host - Ordner in den Container in dem Ausgabepfad für die Datei montiert ist :
Führen Sie das Skript:
docker-compose up -d
Wir fordern eine Liste der laufenden Container an:
docker-compose ps
Öffnen Sie die Containerkonsole:
docker exec -it srv_web_1 bash
Wir beginnen mit der Generierung des Schlüssels im NGINX-Konfigurationsordner (der, wie wir uns erinnern, vom Host bereitgestellt wird):
openssl dhparam -out /etc/nginx/conf.d/dhparams.pem 2048
Bewegen Sie den Schlüssel nach ./dhparams/dhparam-2048.pem.
Beenden Sie die Containerkonsole Strg-D und stoppen Sie das Skript:
docker-compose down
Ändern wir nun die NGINX-Konfiguration ./conf.d/defaulf.conf :
Fügen Sie einen neuen Speicherort hinzu ^ ~ /.well-known/acme-challenge , um statische Dateien aus dem Ordner / usr / share / nginx / html / letsencrypt bereitzustellen . Hier werden die Certbot-Bestätigungsdateien abgelegt. Richten wir eine Umleitung für alle anderen Anforderungen an https ein.
Alles ist bereit für das erste SSL-Zertifikat.
Kopieren wir unser Projekt mit dem folgenden Befehl in den VPS in einen neuen Ordner / opt / srv_1 / :
scp -r ./* root@91.230.60.120:/opt/srv_1/
Lassen Sie uns von VScode über SSH zu VPS verbinden.
Gehen wir zum Ordner des laufenden Servers:
cd /opt/srv_0/
und stoppen Sie das Skript:
docker-compose down
Gehen Sie nun zum neuen Serverordner cd / opt / srv_1 / und führen Sie das Skript aus:
docker-compose up
In der Konsole sehen wir, dass certbot eine Bestätigungsdatei zeS4O87S6AfRQ3Kj4MaBlBFZx3AIiWdPn61DwogDMK4 erstellt und diese an den Let's-Verschlüsselungsdienst gemeldet hat, der diese Datei wiederum von vier verschiedenen IP-Adressen angefordert und dann ein Zertifikat ausgestellt hat. Das vollständige Kettenzertifikat und der private Schlüssel wurden im entsprechenden Ordner gespeichert. Das Zertifikat ist 90 Tage gültig (bis 05.10.2020).
Es ist Zeit, einen zweiten Speicherort für eine sichere Verbindung in der NGINX-Konfiguration auf dem Server zu erstellen ./conf.d/defaulf.conf : Starten Sie
das Skript neu
docker-compose restart
Mal sehen, wie der Browser auf unser Zertifikat reagiert:
Google Chrome ist mit unserem Zertifikat zufrieden. Jetzt ist die Aufgabe komplizierter - wir werden die Sicherheit und Verfügbarkeit für verschiedene Browser unserer SSL-Verbindung https://www.ssllabs.com/ssltest/ testen . Wir geben die Adresse ein und erhalten das Ergebnis:
Mit dem Zertifikat und dem Schlüsselaustausch ist alles in Ordnung (dank Diffie-Hellman), aber der Testroboter hat die Bewertung ("B" ist unserer Meinung nach "4") für die Unterstützung der veralteten Protokolle TLS1.0 und TLS1.1 gesenkt ... Es ist nicht schwierig, sie in der NGINX-Konfiguration zu deaktivieren. Wenn wir jedoch den Testbericht weiter betrachten, sehen wir, dass beispielsweise die Browser einiger mobiler Geräte in diesem Fall keine Verbindung herstellen können:
Es sind noch mehrere Serviceaufgaben auszuführen.
Die Anzahl der Versuche, ein Zertifikat für eine Domain zu erhalten, sollte innerhalb von 7 Tagen 5 nicht überschreiten. Danach kann uns der Let's-Verschlüsselungsdienst blockieren. Um jedoch das Skript während der Entwicklung jedes Mal ausgeführt wird certbot wird versuchen , dies zu tun, so in dem Docker-compose.dev.yaml Skript, das ändern Befehlsparameter certbot Containers :
Der --dry-run - Flag ein Test ohne bekommt ein Zertifikat ausgeführt werden soll.
Schreiben wir einen Test:
Quellcode Github .
Fazit
In diesem Schritt haben wir die Kommunikation zwischen den Server- und Clientanwendungen gesichert und den Browsern beigebracht, unserer Domain zu "vertrauen".
Im nächsten Artikel werden wir eine flatternde Webseite mit einem Countdown bis zum Start unseres Dienstes schreiben , diese sammeln und auf unserem Server ablegen.