Настройка сервера PHP 7.1 + Nginx + MySQL. Часть 3

Настроим SSL шифрование на нашем сервере:

mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
wget -O - https://www.startssl.com/certs/ca.pem | tee -a ca-certs.pem > /dev/null
wget -O - https://www.startssl.com/certs/sub.class1.server.ca.pem | tee -a ca-certs.pem > /dev/null
wget -O - http://aia.startssl.com/certs/ca.crt | openssl x509 -inform DER -outform PEM | tee -a ca-certs.pem > /dev/null
wget -O - http://aia1.wosign.com/ca1g2-server1-free.cer | openssl x509 -inform DER -outform PEM | tee -a ca-certs.pem > /dev/null
wget -O - http://aia6.wosign.com/ca6.server1.free.cer | openssl x509 -inform DER -outform PEM | tee -a ca-certs.pem > /dev/null
service nginx stop
service nginx start
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
chmod 400 /etc/nginx/ssl/*
service nginx restart 
service php7.1-fpm restart
Теперь можно установить CertBot
Скачиваем дистрибутив

wget -O /usr/local/bin/certbot-auto https://dl.eff.org/certbot-auto
chmod +x /usr/local/bin/certbot-auto
ln -s /usr/local/bin/certbot-auto /usr/local/bin/certbot
Везде ниже вместо команды certbot можно использовать команду certbot-auto
Мы будем получать сертификаты по методу webroot без перенастройки или остановки веб-сервера, под которым подразумевается nginx. Нам нужен какой-то каталог, в который certbot будет писать свои файлы, и какой должен быть доступен из сети удостоверяющему серверу согласно протокола ACME.

Чтобы не писать каждый раз длинную строку из опций, а еще лучше — не вспоминать о них, запишем основные настройки в файл конфигурации, который certbot ожидает найти в /etc/letsencrypt/cli.ini:

nano /etc/letsencrypt/cli.ini
Прописываем:
authenticator = webroot
webroot-path = /var/www/html
post-hook = service nginx reload
text = True
Ожидается что certbot будет создавать необходимые для проверки прав на домен файлы в подкаталогах ниже по иерархии к указанному. Вроде таких:

/var/www/html/.well-known/acme-challenge/example.html

Эти файлы должны будут быть доступны из сети на целевом домене

Создаем нужный каталог в директории сервера по-умолчанию — html
mkdir -p /var/www/html/.well-known/acme-challenge
Регистрация в Let's Encrypt. Регистрацию нужно сделать только один раз:

certbot register --email me@example.com
Подготовим nginx к получению сертификатов, для получения сертификата необходимо во всех блоках server добавить следующий блок до других блоков location:

Понятно, что вписывать для каждого сайта такой блок явно — это моветон, потому создадим файл /etc/nginx/acme с содержанием блока выше.

nano /etc/nginx/acme
Прописываем

location /.well-known {
    root /var/www/html;
}
Затем для каждого домена и поддомена, для которых нужно получить сертификаты, в блоке server перед всеми блоками location укажем:

include acme;
Если у нас уже все сайты работают по HTTPS, то вся схема будет работать если настроен переадресующий сервер на 80 порту, сохраняющий $request_uri в ответе (ниже в файле sslconf.sh мы пропишем создание этой конструкции:

server {
        listen 80;
        server_name .$DOMAIN;
        return 301 https://$DOMAIN\$request_uri;
}
Чтобы добавить SSL к существующему сайту создадим скрипт, который все сделает автоматически (установит файл сертификата от Let's Encrypt, а также изменить конфигурационный файл Nginx для этого сайта (хоста), перезагрузит веб-сервер и следующее соединение с нашим сайтом будет зашифрованным!
Назовем наш скрипт sslconf.sh

cd /root
nano sslconf.sh
Вставляем сам скрипт

#!/bin/bash

echo "Enter username for site"
read USERNAME

echo "Enter domain"
read DOMAIN

echo "Enter email of domain's admin"
read EMAIL
##############

echo "Creating SSL"
certbot certonly --webroot --agree-tos --email $EMAIL -w /var/www/$USERNAME/www -d $DOMAIN

echo "Creating vhost file"
echo "upstream backend-$USERNAME {server unix:/var/run/php/php7.1-$USERNAME.sock;}

server {
        server_name                     $DOMAIN www.$DOMAIN;
        root                            /var/www/$USERNAME/www;
        access_log                      /var/log/nginx/$USERNAME-access.log;
        error_log                       /var/log/nginx/$USERNAME-error.log;
        index                           index.php index.html;
        rewrite_log                     on;

        listen 443 http2;
        ssl on;
        ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;

        ssl_session_cache shared:SSL:100m;
        ssl_session_timeout 60m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        ssl_ciphers 'EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DES';
        ssl_prefer_server_ciphers on;

        ssl_stapling on;
        ssl_stapling_verify on;

        resolver 8.8.8.8 [2001:4860:4860::8888];
        ssl_trusted_certificate /etc/nginx/ssl/ca-certs.pem;

        add_header Strict-Transport-Security 'max-age=31536000' always;

        add_header Public-Key-Pins 'pin-sha256="base64+info1="; max-age=31536000' always;

        if (\$host != '$DOMAIN' ) {
            rewrite                 ^/(.*)$  https://$DOMAIN/\$1  permanent;
        }

		include acme;

        location ~* ^/core/ {
            deny                    all;
        }
        location / {
            try_files               \$uri \$uri/ @rewrite;
        }
        location /index.html {
            rewrite                 // permanent;
        }

        location ~ ^/(.*?)/index\.html$ {
            rewrite                 ^/(.*?)/ // permanent;
        }
        location @rewrite {
            rewrite                 ^/(.*)$ /index.php?q=\$1;
        }
        location ~ \.php$ {
            include                 fastcgi_params;
            fastcgi_param           SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
            fastcgi_pass            backend-$USERNAME;
        }
        location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|bmp)$ {
            access_log              off;
            expires                      10d;
            break;
        }
        location ~ /\.ht {
            deny                    all;
        }
	location = /favicon.ico {
            access_log off; log_not_found off;
        }


}

server {
        listen 80;
        server_name .$DOMAIN;
        return 301 https://$DOMAIN\$request_uri;
}
" > /etc/nginx/sites-available/$USERNAME.conf
ln -s /etc/nginx/sites-available/$USERNAME.conf /etc/nginx/sites-enabled/$USERNAME.conf

#############

echo "Reloading nginx"
service nginx stop
service nginx start
echo "Reloading php7-fpm"
service php7.1-fpm reload
Делаем исполняемым

chmod +x sslconf.sh
Запускаем

./sslconf.sh
Скрипт попросит указать имя пользователя сайта, имя домена и адрес эл. почты администратора, на этот адрес могут приходить уведомления о состоянии сертификата
При первом выполнении будут скачаны необходимые программные пакеты
17 марта 2017, 21:41    Alexey Заметки 0    1 0

Комментарии (0)

    Вы должны авторизоваться, чтобы оставлять комментарии.