SSL Zertifikat für Docker Web-App

In diesem Artikel möchte ich Ihnen eine Möglichkeit geben, ein SSL-Zertifikat für Ihre Docker-Webanwendung zu erstellen im russischsprachigen Teil des Internets - eine ähnliche Lösung habe ich nicht gefunden.

Bild

Weitere Details unter dem Schnitt.

Wir hatten Docker v.17.05, Docker-Compose v.1.21, Ubuntu Server 18 und ein Pint sauberes Let'sEncrypt. Nicht, dass es notwendig wäre, die Produktion auf Docker bereitzustellen. Aber wenn Sie anfingen, Docker zu sammeln, wird es schwierig, damit aufzuhören.

Für den Anfang gebe ich Ihnen die Standardeinstellungen, die wir in der Entwicklungsphase hatten, d. H. ohne 443 Ports und SSL im Allgemeinen:

docker-compose.yml
version: '2' services: php: build: ./php-fpm volumes: - ./StomUp:/var/www/StomUp - ./php-fpm/php.ini:/usr/local/etc/php/php.ini depends_on: - mysql container_name: "StomPHP" web: image: nginx:latest ports: - "80:80" - "443:443" volumes: - ./StomUp:/var/www/StomUp - ./nginx/main.conf:/etc/nginx/conf.d/default.conf depends_on: - php mysql: image: mysql:5.7 command: mysqld --sql_mode="" environment: MYSQL_ROOT_PASSWORD: xxx ports: - "3333:3306" 


nginx / main.conf
  server { listen 80; server_name *.stomup.ru stomup.ru; root /var/www/StomUp/public; client_max_body_size 5M; location / { # try to serve file directly, fallback to index.php try_files $uri /index.php$is_args$args; } location ~ ^/index\.php(/|$) { #fastcgi_pass unix:/var/run/php7.2-fpm.sock; fastcgi_pass php:9000; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; internal; } location ~ \.php$ { return 404; } error_log /var/log/nginx/project_error.log; access_log /var/log/nginx/project_access.log; } 


Als nächstes müssen wir tatsächlich SSL implementieren. Ehrlich gesagt - ich habe die Kommunikationszone I in der Größenordnung von 2 Stunden studiert. Alle dort vorgeschlagenen Optionen sind interessant. In der aktuellen Phase des Projekts mussten wir (das Unternehmen) SSL Let'sEnctypt schnell und zuverlässig an den Nginx- Container befestigen und nicht mehr.

Zunächst haben wir certbot auf dem Server installiert
sudo apt-get install certbot

Als Nächstes haben wir Platzhalterzertifikate für unsere Domain generiert

 sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns 

Nach der Ausführung stellt certbot uns 2 TXT-Einträge zur Verfügung, die in den DNS-Einstellungen angegeben werden müssen.

 _acme-challenge.stomup.ru TXT {CertBot} 

Und drücken Sie die Eingabetaste.

Anschließend überprüft certbot die Verfügbarkeit dieser Einträge in DNS und erstellt Zertifikate für Sie.
Wenn Sie ein Zertifikat hinzugefügt haben, Certbot es jedoch nicht gefunden hat, starten Sie den Befehl nach 5-10 Minuten erneut .

Nun, hier sind wir stolze Besitzer des Let'sEncrypt-Zertifikats für 90 Tage, aber jetzt müssen wir es an Docker senden.

Dazu verknüpfen wir auf banalste Weise in der Datei docker-compose.yml im Abschnitt nginx Verzeichnisse.

Docker-compose.yml Beispiel mit SSL
 version: '2' services: php: build: ./php-fpm volumes: - ./StomUp:/var/www/StomUp - /etc/letsencrypt/live/stomup.ru/:/etc/letsencrypt/live/stomup.ru/ - ./php-fpm/php.ini:/usr/local/etc/php/php.ini depends_on: - mysql container_name: "StomPHP" web: image: nginx:latest ports: - "80:80" - "443:443" volumes: - ./StomUp:/var/www/StomUp - /etc/letsencrypt/:/etc/letsencrypt/ - ./nginx/main.conf:/etc/nginx/conf.d/default.conf depends_on: - php mysql: image: mysql:5.7 command: mysqld --sql_mode="" environment: MYSQL_ROOT_PASSWORD: xxx ports: - "3333:3306" 


Hast du verlinkt? Super - weiter:

Jetzt müssen wir die Nginx- Konfiguration ändern, damit sie mit Port 443 und SSL im Allgemeinen funktioniert:

Main.conf Konfigurationsbeispiel mit SSL
 # server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name *.stomup.ru stomup.ru; set $base /var/www/StomUp; root $base/public; # SSL ssl_certificate /etc/letsencrypt/live/stomup.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/stomup.ru/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/stomup.ru/chain.pem; client_max_body_size 5M; location / { # try to serve file directly, fallback to index.php try_files $uri /index.php$is_args$args; } location ~ ^/index\.php(/|$) { #fastcgi_pass unix:/var/run/php7.2-fpm.sock; fastcgi_pass php:9000; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; internal; } location ~ \.php$ { return 404; } error_log /var/log/nginx/project_error.log; access_log /var/log/nginx/project_access.log; } # HTTP redirect server { listen 80; listen [::]:80; server_name *.stomup.ru stomup.ru; location / { return 301 https://stomup.ru$request_uri; } } 


Eigentlich gehen wir nach diesen Manipulationen mit Docker-compose in das Verzeichnis, schreiben Docker-compose auf -d. Und wir überprüfen die Funktionalität von SSL. Alles sollte abheben.

Das Wichtigste ist, nicht zu vergessen, dass das Let'sEnctypt-Zertifikat 90 Tage lang ausgestellt wird. Sie müssen es über den sudo certbot renew aktualisieren und dann das Projekt mit dem sudo certbot renew docker-compose restart sudo certbot renew neu docker-compose restart

Alternativ können Sie diese Sequenz zu crontab hinzufügen.

Meiner Meinung nach ist dies der einfachste Weg, SSL mit der Docker Web-App zu verbinden.

PS Bitte beachten Sie, dass alle im Text vorgestellten Skripte nicht endgültig sind. Jetzt befindet sich das Projekt im Deep-Dev-Stadium. Daher möchte ich Sie bitten, die Konfigurationsdateien nicht zu kritisieren - sie werden noch mehrmals geändert.

Source: https://habr.com/ru/post/de481362/


All Articles