SSL-Zertifikat für die Docker-Webanwendung

In diesem Artikel möchte ich Ihnen eine Methode zum Erstellen eines SSL-Zertifikats für Ihre auf Docker ausgeführte Webanwendung vorstellen, weil ... Im russischsprachigen Teil des Internets habe ich eine solche Lösung nicht gefunden.

SSL-Zertifikat für die Docker-Webanwendung

Weitere Details unter dem Schnitt.

Wir hatten Docker v.17.05, Docker-Compose v.1.21, Ubuntu Server 18 und einen halben Liter reines Let'sEncrypt. Es ist nicht notwendig, die Produktion auf Docker bereitzustellen. Aber sobald man mit der Entwicklung von Docker beginnt, wird es schwierig, damit aufzuhören.

Zunächst gebe ich die Standardeinstellungen an, die wir in der Entwicklungsphase hatten, d. h. ohne Port 443 und SSL allgemein:

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. Um ehrlich zu sein, habe ich ungefähr zwei Stunden damit verbracht, die Kommunikationszone zu studieren. Alle dort angebotenen Optionen sind interessant. Aber in der aktuellen Phase des Projekts mussten wir (das Unternehmen) schnell und zuverlässig Probleme lösen SSL Let'sEnctypt к Behälter und nichts weiter.

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

Als nächstes haben wir Wildcard-Zertifikate für unsere Domain generiert

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


Nach der Ausführung stellt uns certbot 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 prüft certbot das Vorhandensein dieser Einträge im DNS und erstellt Zertifikate für Sie.
wenn Sie aber ein Zertifikat hinzugefügt haben certbot Ich habe es nicht gefunden. Versuchen Sie, den Befehl nach 5–10 Minuten neu zu starten.

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

Um dies zu tun, verknüpfen wir auf einfachste Weise in docker-compose.yml im Abschnitt nginx die Verzeichnisse.

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"

Verlinkt? Großartig – weiter geht’s:

Jetzt müssen wir die Konfiguration ändern arbeiten mit 443 Hafen und SSL im Allgemeinen:

Beispiel einer main.conf-Konfiguration 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;
	}
}

Tatsächlich gehen wir nach diesen Manipulationen mit Docker-compose in das Verzeichnis und schreiben docker-compose up -d. Und wir prüfen die Funktionalität von SSL. Alles sollte abheben.

Vergessen Sie vor allem nicht, dass das Let'sEnctypt-Zertifikat für 90 Tage ausgestellt wird und Sie es über den Befehl erneuern müssen sudo certbot renew, und starten Sie dann das Projekt mit dem Befehl neu docker-compose restart

Eine andere Möglichkeit besteht darin, diese Sequenz zu Crontab hinzuzufügen.

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

PS: Bitte beachten Sie, dass nicht alle im Text vorgestellten Skripte endgültig sind. Das Projekt befindet sich derzeit in der Entwicklungsphase. Daher möchte ich Sie bitten, die Konfigurationen nicht zu kritisieren – sie werden viele Male geändert.

Source: habr.com

Kommentar hinzufügen