Πιστοποιητικό SSL για την εφαρμογή web Docker

Σε αυτό το άρθρο, θέλω να μοιραστώ μαζί σας μια μέθοδο για τη δημιουργία πιστοποιητικού SSL για την εφαρμογή web που εκτελείται στο Docker, επειδή... Δεν βρήκα τέτοια λύση στο ρωσόφωνο τμήμα του Διαδικτύου.

Πιστοποιητικό SSL για την εφαρμογή web Docker

Περισσότερες λεπτομέρειες κάτω από το κόψιμο.

Είχαμε docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 και μια πίντα καθαρού Let'sEncrypt. Δεν είναι ότι είναι απαραίτητο να αναπτυχθεί η παραγωγή στο Docker. Αλλά μόλις ξεκινήσετε την κατασκευή του Docker, γίνεται δύσκολο να σταματήσετε.

Λοιπόν, για αρχή, θα δώσω τις τυπικές ρυθμίσεις - που είχαμε στο στάδιο του dev, δηλ. χωρίς θύρα 443 και SSL γενικά:

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

Στη συνέχεια, πρέπει πραγματικά να εφαρμόσουμε SSL. Για να είμαι ειλικρινής, πέρασα περίπου 2 ώρες μελετώντας το com zone. Όλες οι επιλογές που προσφέρονται εκεί είναι ενδιαφέρουσες. Αλλά στο τρέχον στάδιο του έργου, εμείς (η επιχείρηση) έπρεπε να βιδώσουμε γρήγορα και αξιόπιστα SSL Let'sEnctypt к nginx δοχείο και τίποτα περισσότερο.

Πρώτα απ 'όλα, το εγκαταστήσαμε στον διακομιστή certbot
sudo apt-get install certbot

Στη συνέχεια, δημιουργήσαμε πιστοποιητικά μπαλαντέρ για τον τομέα μας

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


μετά την εκτέλεση, το certbot θα μας παράσχει 2 εγγραφές TXT που πρέπει να καθοριστούν στις ρυθμίσεις DNS.

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


Και πατήστε enter.

Μετά από αυτό, το certbot θα ελέγξει για την παρουσία αυτών των εγγραφών στο DNS και θα δημιουργήσει πιστοποιητικά για εσάς.
εάν έχετε προσθέσει πιστοποιητικό αλλά certbot δεν το βρήκα - δοκιμάστε να επανεκκινήσετε την εντολή μετά από 5-10 λεπτά.

Λοιπόν, εδώ είμαστε οι περήφανοι κάτοχοι ενός πιστοποιητικού Let'sEncrypt για 90 ημέρες, αλλά τώρα πρέπει να το ανεβάσουμε στο Docker.

Για να γίνει αυτό, με τον πιο τετριμμένο τρόπο, στο docker-compose.yml, στην ενότητα nginx, συνδέουμε τους καταλόγους.

Παράδειγμα docker-compose.yml με 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"

Συνδεδεμένοι; Τέλεια - ας συνεχίσουμε:

Τώρα πρέπει να αλλάξουμε τις ρυθμίσεις nginx για να δουλέψω με 443 λιμάνι και SSL γενικά:

Παράδειγμα διαμόρφωσης main.conf με 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;
	}
}

Στην πραγματικότητα, μετά από αυτούς τους χειρισμούς, πηγαίνουμε στον κατάλογο με Docker-compose, γράφουμε docker-compose up -d. Και ελέγχουμε τη λειτουργικότητα του SSL. Όλα πρέπει να απογειωθούν.

Το κύριο πράγμα είναι να μην ξεχνάτε ότι το πιστοποιητικό Let'sEnctypt εκδίδεται για 90 ημέρες και θα πρέπει να το ανανεώσετε μέσω της εντολής sudo certbot renew, και στη συνέχεια επανεκκινήστε το έργο με την εντολή docker-compose restart

Μια άλλη επιλογή είναι να προσθέσετε αυτήν την ακολουθία στο crontab.

Κατά τη γνώμη μου, αυτός είναι ο ευκολότερος τρόπος για να συνδέσετε το SSL με την εφαρμογή Web Docker.

Υ.Γ. Λάβετε υπόψη σας ότι όλα τα σενάρια που παρουσιάζονται στο κείμενο δεν είναι οριστικά, το έργο βρίσκεται τώρα στο στάδιο Dev Dev, οπότε θα ήθελα να σας ζητήσω να μην επικρίνετε τις ρυθμίσεις παραμέτρων - θα τροποποιηθούν πολλές φορές.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο