Certificado SSL para aplicativo da web Docker

Neste artigo, quero compartilhar com você uma maneira de criar um certificado SSL para seu aplicativo Web Docker, como na parte em russo da Internet - não encontrei uma solução semelhante.

imagem

Mais detalhes sob o corte.

Tivemos o docker v.17.05, o docker-compose v.1.21, o Ubuntu Server 18 e um litro de Let'sEncrypt limpo. Não que seja necessário implantar a produção no Docker. Mas se você começou a coletar o Docker, fica difícil parar.

Portanto, para começar, darei a você as configurações padrão - que tínhamos no estágio de desenvolvimento, ou seja, sem 443 portas e SSL em geral:

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


Em seguida, precisamos realmente implementar o SSL. Sinceramente - estudei a zona com I da ordem de 2 horas. Todas as opções propostas são interessantes. Mas, no estágio atual do projeto, nós (a empresa) precisávamos rapidamente e confiavelmente fixar o SSL Let'sEnctypt no contêiner nginx e não mais.

Primeiro, instalamos o certbot no servidor
sudo apt-get install certbot

Em seguida, geramos certificados curinga para nosso domínio

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

após a execução, o certbot nos fornecerá 2 registros TXT que precisam ser especificados nas configurações de DNS.

 _acme-challenge.stomup.ru TXT {CertBot} 

E pressione enter.

Depois disso, o certbot verificará a disponibilidade desses registros no DNS e criará certificados para você.
se você adicionou um certificado, mas o certbot não o encontrou, tente reiniciar o comando após 5 a 10 minutos .

Bem, aqui somos os orgulhosos proprietários do certificado Let'sEncrypt por 90 dias, mas agora precisamos enviá-lo ao Docker.

Para fazer isso, da maneira mais banal, no docker-compose.yml, na seção nginx, vinculamos diretórios.

Exemplo de Docker-compose.yml com 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" 


Você ligou? Super - continuar:

Agora precisamos alterar a configuração do nginx para funcionar com a porta 443 e SSL em geral:

Exemplo de configuração do Main.conf com 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; } } 


Na verdade, depois dessas manipulações - vamos ao diretório com Docker-compose, escrevemos docker-compose up -d. E verificamos a funcionalidade do SSL. Tudo deve decolar.

O principal é não esquecer que o certificado Let'sEnctypt é emitido por 90 dias e você precisará atualizá-lo através do sudo certbot renew e, em seguida, reiniciar o projeto com o docker-compose restart

Como alternativa, adicione esta sequência ao crontab.

Na minha opinião, esta é a maneira mais fácil de conectar SSL ao aplicativo da Web Docker.

PS Por favor, leve em consideração que todos os scripts apresentados no texto não são finais, agora o projeto está no estágio profundo do desenvolvedor, portanto, peço que você não critique os arquivos de configuração - eles serão modificados muitas vezes.

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


All Articles