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 Docker, comme dans la partie russe de l'Internet - je n'ai pas trouvé de solution similaire.

image

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 Let'sEncrypt propre. Non qu'il soit nécessaire de déployer la production sur Docker. Mais si vous avez commencé à collectionner Docker, il devient difficile de s'arrêter.

Donc pour commencer, je vais vous donner les paramètres par défaut - que nous avions au stade du développement, c'est-à-dire sans 443 ports 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. Honnêtement - j'ai étudié la zone com I de l'ordre de 2 heures. Toutes les options proposées y sont intéressantes. Mais au stade actuel du projet, nous (l'entreprise) avions besoin de lier rapidement et de manière fiable Let'sEnctypt SSL au conteneur nginx et pas plus.

Tout d'abord, nous avons installé certbot sur le serveur
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 disponibilité de ces enregistrements dans DNS et créera des certificats pour vous.
si vous avez ajouté un certificat mais que certbot ne l'a pas trouvé, essayez de redémarrer la commande après 5 à 10 minutes .

Eh bien, nous sommes ici les fiers propriétaires du certificat Let'sEncrypt pendant 90 jours, mais nous devons maintenant l'envoyer à Docker.

Pour ce faire, de la manière la plus banale, dans docker-compose.yml, dans la section nginx, nous lions des 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" 


Avez-vous lié? Super - continuer:

Maintenant, nous devons changer la configuration nginx pour qu'elle fonctionne avec le port 443 et SSL en général:

Exemple de configuration de 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 - nous allons dans le répertoire avec Docker-compose, écrivons 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 émis pendant 90 jours et que vous devrez le mettre à jour via la sudo certbot renew , puis redémarrer le projet avec la commande docker-compose restart

Vous pouvez également 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 finaux, maintenant le projet est au stade de développement profond, donc je veux vous demander de ne pas critiquer la config, ils seront modifiés de nombreuses fois.

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


All Articles