Всё о web

Для чайников и не только


Переводим wordpress на HTTPS + nginx

Январь 9, 2017

Если Вы ещё не в курсе, гугл уже давно https сайты ранжирует выше, чем http. А в ближайших планах он начнёт помечать все http сайты как небезопасные. К счастью "Let's Encrypt" предоставляет бесплатные сертификаты.

Первое что нужно сделать это ознакомиться с инструкцией: https://letsencrypt.org/getting-started/

Из которой мы узнаём что нам нужны Certbot и shh доступ к серверу. На этом месте я передаю пламенный привет всем любителям shared хостингов и конструкторов сайтов. 5$ за собственный сервер это так дорого, Вы же не лохи, у Вас же серьёзный бизнес.

Если у Вас нет ssh доступа к серверу, или Вы не знаете что это, не читайте дальше.

Получаем https сертификат

Заходим на страницу Certbot: https://certbot.eff.org/#ubuntuxenial-nginx и читаем её внимательно.

Действуем по инструкции, устанавливаем letsencrypt:

sudo apt-get install letsencrypt

Останавливаем nginx:

sudo service nginx stop

Сервер можно не останавливать, но тогда придётся сперва его переконфигурировать, чтобы доступ к папке /.well-known был всегда открыт.

Теперь получаем сам сертификат:

letsencrypt certonly --standalone -d example.com -d www.example.com

В процессе Вас попросят согласиться с условиями использования:

и ввести email для связи:

Файлы сертификата будут лежать в папке: /etc/letsencrypt/archive/_ВАШ_ДОМЕН, а в папке /etc/letsencrypt/live/_ВАШ_ДОМЕН будут лежать симлинки, которые нам потребуются позднее. Сертификаты, обязательно, забэкапте.

Переконфигурируем nginx под https

Открываем конфигурационный файл Вашего веб-сайта, это будет что-то вроде: /etc/nginx/sites-available/default

Всё где есть упоминание 80 порта комментируем, или удаляем, например:

listen 80;
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

И все подобные строки. Вместо них добавляем:

listen 443 ssl;
server_name _ВАШ_ДОМЕН_ www._ВАШ_ДОМЕН_;

Этим мы сообщили серверу, что слушать нужно ssl порт, а не http. Далее добавляем поддержку сертификата:

ssl_certificate /etc/letsencrypt/live/_ВАШ_ДОМЕН_/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/_ВАШ_ДОМЕН_/privkey.pem;

Запускаем nginx:

service nginx start

И проверяем. Теперь адрес http://_ВАШ_ДОМЕН_ не должен открываться, зато адрес https://_ВАШ_ДОМЕН_ должен работать.

Фиксим, в этот же конф. файл добавляем секцию:

>
server {
        listen 80;
        server_name _ВАШ_ДОМЕН_ www._ВАШ_ДОМЕН_;
        return 301 https://$host$request_uri;
}

Перезапускаем nginx:

service nginx restart

Опять проверяем адрес: http://_ВАШ_ДОМЕН_ сейчас он должен автоматически редиректиться на https адрес.

Теоретически, теперь у нас всё готово. Но мы можем ещё улучшить шифрование. Давайте cгенерируем сильную группу Дефи-Хелмана:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

И допишем конфиг nginx:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

Итоговый конфиг для nginx с https:

                                                                                           
server {
        listen 80;
        server_name _ВАШ_ДОМЕН_ www._ВАШ_ДОМЕН_;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        server_name _ВАШ_ДОМЕН_ www._ВАШ_ДОМЕН_;

        ssl_certificate /etc/letsencrypt/live/_ВАШ_ДОМЕН_/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/_ВАШ_ДОМЕН_/privkey.pem;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;

        root /var/www/_ВАШ_ДОМЕН_;
        index index.html index.htm index.php;

        proxy_read_timeout 20;
        proxy_send_timeout 20;

        gzip on;
        gzip_disable "msie6";
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

        location ~ /\. {
                deny all;
        }

        location ~* /(?:uploads|files)/.*\.php$ {
                deny all;
        }

        location = /xmlrpc.php {
                deny all;
                access_log off;
                log_not_found off;
        }

        location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
                access_log off;
                log_not_found off;
        }

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }
}


Комментарии

Оставить комментарий:

Ваш e-mail не будет опубликован. Обязательные поля помечены *