SSL-Zertifikat fĂŒr Docker-Webanwendungen

In diesem Artikel möchte ich mit Ihnen teilen, wie Sie ein SSL-Zertifikat fĂŒr Ihre Webanwendung erstellen, die auf Docker lĂ€uft, da ich in der russischsprachigen Community keine vergleichbare Lösung gefunden habe.

SSL-Zertifikat fĂŒr Docker-Webanwendungen

Mehr dazu unter dem Beitrag.

Wir hatten Docker v.17.05, Docker-Compose v.1.21, Ubuntu Server 18 und einen frischen Let’s Encrypt. Es ist nicht unbedingt erforderlich, die Produktion auf Docker zu betreiben. Aber wenn man erst einmal anfĂ€ngt, Docker zu nutzen, fĂ€llt es schwer, damit aufzuhören.

Lassen Sie mich zunÀchst die Standardkonfigurationen angeben, die wir in der Entwicklungsphase hatten, also ohne Port 443 und SSL insgesamt:

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 / {
        # Versuch, die Datei direkt bereitzustellen, andernfalls auf index.php zurĂŒckgreifen
        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;
}

Nun mĂŒssen wir SSL implementieren. Um ehrlich zu sein, habe ich die com-Zone etwa zwei Stunden studiert. Alle vorgeschlagenen Optionen dort sind interessant. Aber in der aktuellen Phase des Projekts mussten wir (das GeschĂ€ft) schnell und zuverlĂ€ssig integrieren. SSL Let’s Encrypt zu nginx Container und nicht mehr.

Zuerst haben wir auf dem Server installiert certbot
sudo apt-get install certbot

Dann haben wir Wildcard-Zertifikate fĂŒr unser Nach Abschluss des Transfers kann die Domain auf unser Hosting gerichtet werden.

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


Nach der AusfĂŒhrung von certbot wird uns 2 TXT-EintrĂ€ge bereitgestellt, die in den DNS-Einstellungen angegeben werden mĂŒssen.

_acme-challenge.stomup.ru TXT {derSchlĂŒsselDenSieVonCertBotErhaltenHaben}


Und drĂŒcken Sie Enter.

Danach ĂŒberprĂŒft certbot die EintrĂ€ge im DNS und erstellt die Zertifikate fĂŒr Sie.
Wenn Sie das Zertifikat hinzugefĂŒgt haben, es aber certbot nicht gefunden wurde – versuchen Sie es in 5-10 Minuten erneut..

So sind wir jetzt stolze Besitzer eines Let’sEncrypt-Zertifikats fĂŒr 90 Tage, aber jetzt mĂŒssen wir es in Docker integrieren.

Dazu verknĂŒpfen wir ganz einfach die Verzeichnisse in der docker-compose.yml im nginx-Bereich.

Beispiel docker-compose.yml 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"

VerknĂŒpft? Super – wir machen weiter:

Jetzt mĂŒssen wir die Konfiguration Ă€ndern nginx um mit 443 dem Port zu arbeiten und SSL insgesamt:

Beispielkonfiguration main.conf 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;
	}
}

Nach diesen Änderungen gehen wir in das Verzeichnis mit Docker-compose, schreiben docker-compose up -d und ĂŒberprĂŒfen die FunktionalitĂ€t von SSL. Es sollte alles funktionieren.

Denken Sie daran, dass das Let’sEncrypt-Zertifikat fĂŒr 90 Tage ausgestellt wird und Sie es mit dem Befehl sudo certbot renew, danach das Projekt mit dem Befehl docker-compose restart

neustarten mĂŒssen. Eine Möglichkeit wĂ€re, diese Befehlsfolge in den crontab hinzuzufĂŒgen.

Meiner Meinung nach ist dies der einfachste Weg, SSL zu Docker Web-Apps hinzuzufĂŒgen.

P.S. Bitte beachten Sie, dass alle im Text vorgestellten Skripte nicht final sind, da sich das Projekt in einer intensiven Entwicklungsphase befindet. Daher möchte ich Sie bitten, die Konfigurationen nicht zu kritisieren – sie werden noch oft geĂ€ndert.

Quelle: habr.com

Erwerben Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster