Certificat SSL pour l'application Web Docker

Dans cet article, je souhaite partager avec vous une méthode pour créer un certificat SSL pour votre application web exécutée sur Docker, car... Je n’ai pas trouvé une telle solution dans la partie Internet en langue russe.

Certificat SSL pour l'application Web Docker

Plus de détails sous la coupe.

Nous avions docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 et une pinte de pur Let'sEncrypt. Ce n’est pas qu’il soit nécessaire de déployer la production sur Docker. Mais une fois que vous avez commencé à créer Docker, il devient difficile de vous arrêter.

Donc, pour commencer, je vais donner les paramètres standards - que nous avions au stade du développement, c'est-à-dire sans port 443 et SSL en général :

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;
}

Ensuite, nous devons réellement implémenter SSL. Pour être honnête, j'ai passé environ 2 heures à étudier la zone com. Toutes les options qui y sont proposées sont intéressantes. Mais au stade actuel du projet, nous (l'entreprise) avions besoin de visser rapidement et de manière fiable SSL Let'sEnctypt к nginx conteneur et rien de plus.

Tout d'abord, nous l'avons installé sur le serveur certbot
sudo apt-get install certbot

Ensuite, nous avons généré des certificats génériques pour notre domaine

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


après exécution, certbot nous fournira 2 enregistrements TXT qui doivent être spécifiés dans les paramètres DNS.

_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}


Et appuyez sur Entrée.

Après cela, certbot vérifiera la présence de ces enregistrements dans DNS et créera des certificats pour vous.
si vous avez ajouté un certificat mais certbot je ne l'ai pas trouvé - essayez de redémarrer la commande après 5 à 10 minutes.

Eh bien, nous voici les fiers propriétaires d'un certificat Let'sEncrypt depuis 90 jours, mais nous devons maintenant le télécharger sur Docker.

Pour ce faire, de la manière la plus triviale, dans docker-compose.yml, dans la section nginx, on relie les répertoires.

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

Lié? Super - continuons :

Maintenant nous devons changer la configuration nginx travailler avec 443 port et SSL en général:

Exemple de configuration main.conf avec 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;
	}
}

En fait, après ces manipulations, on va dans le répertoire avec Docker-compose, on écrit docker-compose up -d. Et nous vérifions la fonctionnalité de SSL. Tout devrait décoller.

L'essentiel est de ne pas oublier que le certificat Let'sEnctypt est délivré pour 90 jours et vous devrez le renouveler via la commande sudo certbot renew, puis redémarrez le projet avec la commande docker-compose restart

Une autre option consiste à ajouter cette séquence à crontab.

À mon avis, c'est le moyen le plus simple de connecter SSL à l'application Web Docker.

PS Veuillez prendre en compte que tous les scripts présentés dans le texte ne sont pas définitifs, le projet est maintenant au stade de développement approfondi, je voudrais donc vous demander de ne pas critiquer les configurations - elles seront modifiées plusieurs fois.

Source: habr.com

Ajouter un commentaire