Certificat SSL pour l'application web Docker

Dans cet article, je souhaite partager avec vous comment créer un certificat SSL pour votre application web fonctionnant sur Docker, car je n'ai pas trouvé de solution similaire dans la partie russophone d'Internet.

Certificat SSL pour l'application web Docker

Pour en savoir plus, cliquez ci-dessous.

Nous avions Docker v.17.05, docker-compose v.1.21, Ubuntu Server 18, et une pinte de Let’sEncrypt. Ce n'est pas que dĂ©ployer un environnement de production sur Docker soit nĂ©cessaire. Mais une fois que vous avez commencĂ© Ă  assembler Docker, il devient difficile de s'arrĂȘter.

Alors, je vais d'abord présenter les configurations standard que nous avions à l'étape de développement, c'est-à-dire sans le 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 / {
        # essayer de servir le fichier directement, sinon retour Ă  index.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index.php(\/|$) {
        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 mettre en Ɠuvre SSL. HonnĂȘtement, j'ai Ă©tudiĂ© la zone com pendant environ deux heures. Toutes les options proposĂ©es lĂ -bas sont intĂ©ressantes. Mais Ă  ce stade du projet, nous (l'entreprise) avions besoin de l'intĂ©grer rapidement et de maniĂšre fiable. SSL Let’sEnctypt sur nginx au conteneur, et pas plus.

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

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

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


aprÚs avoir exécuté certbot, deux enregistrements TXT vous seront fournis, que vous devez indiquer dans les paramÚtres DNS.

_acme-challenge.stomup.ru TXT {laCléQueCertBotVousADonne}


Et nous appuyons sur enter.

AprÚs cela, certbot vérifiera la présence de ces enregistrements dans DNS et créera pour vous des certificats.
si vous avez ajouté le certificat mais certbot qu'il n'a pas été trouvé, essayez de redémarrer la commande dans 5-10 minutes..

Eh bien, nous avons maintenant un certificat Let’sEncrypt valable pour 90 jours, mais maintenant nous devons l'intĂ©grer dans Docker.

Pour ce faire, nous allons simplement lier les répertoires dans le fichier docker-compose.yml, dans la section nginx.

Exemple de 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 :

Nous devons maintenant modifier la configuration nginx pour travailler avec 443 le port et SSL en général :

Exemple de config 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;
	}
}

AprĂšs ces manƓuvres, dirigez-vous vers le rĂ©pertoire avec Docker-compose, tapez docker-compose up -d. Et vĂ©rifiez le bon fonctionnement de SSL. Tout devrait fonctionner.

N'oubliez pas que le certificat Let’sEncrypt est valide pendant 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 option serait d'ajouter cette séquence dans crontab.

À mon avis, c'est la maniùre la plus simple de connecter SSL à une application Web Docker.

P.S. Veuillez noter que tous les scripts présentés dans le texte ne sont pas définitifs, le projet est actuellement en phase de développement approfondi, donc je vous demande de ne pas critiquer les configurations - elles seront beaucoup modifiées à l'avenir.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster