Бесплатный переезд Wordpress-блога на SSL

Бесплатный переезд Wordpress-блога на SSL

Инструкция по переезду сайта с HTTP на HTTPS с помощью бесплатного сертификата от известной удостоверяющей организации «Let’s Encrypt». Подойдет для любого сайта, использующего сервер Nginx на Ubuntu, но особенно – для сайта на Wordpress.

1. Подготовка к установке

Необходимо заменить все абсолютные ссылки, ведущие на медиа-контент с http:// в начале адреса, на относительные или универсальные.

Например заменить http://ubuntuclub.org/content/images/2015/Jul/race.jpg на /content/images/2015/Jul/race.jpg или http://ubuntuclub.org/content/images/2015/Jul/race.jpg на //ubuntuclub.org/content/images/2015/Jul/race.jpg

Это необходимо сделать со всеми вашими публикациями, статическими страницами, содержимым тем, как для ссылок на ваш сайт, так и ссылок, открывающих медиаконтент (изображения, видео, pdf и т.п.) с внешних сайтов.

Аналогично нужно поступить со всеми скриптами и стилевыми файлами.

Например заменить: <script src="http://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> на <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> или на <script src="//ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

После того, как все такие ссылки будут найдены и исправлены, вы можете не опасаться, что браузеры будут сообщать об ошибке «смешанного содержимого» по окончании переезда вашего сайта на HTTPS.

2. Установка SSL-сертификата

Установка скрипта генерации сертификата Certbot

cd ~
git clone https://github.com/certbot/certbot
sudo mv certbot /usr/share/

Если у вас еще не установлен менеджер пакетов git, то предварительно запустите

sudo apt-get install git

Подготовка Nginx к генерации сертификатов

Добавьте правило в секцию server конфигурации вашего сайта, позволяющее скрипту certbot проверять ваш сайт

server {
...
    location /.well-known {
        root /usr/share/nginx/html;
    }
...
}

Вместо /usr/share/nginx/html можно указать другой путь, куда certbot сможет складывать свои временные файлы проверки.

Перезагрузите Nginx

sudo service nginx restart

Генерация сертификатов

Запустите проверку возможности выпуска сертификата

sudo /usr/share/certbot/certbot-auto certonly --dry-run --webroot --agree-tos --email email@вашсайт.ru -w /usr/share/nginx/html -d вашсайт.ru -d www.вашсайт.ru

Где email@вашсайт.ru – ваш email, по которому Letsencrypt.org сможет связываться с вами (необязательный параметр) и /usr/share/nginx/html – путь, в котором certbot будет создавать каталог .well-known для проверки и выпуска сертификата.

Если проверка прошла успешно, запустите первичный выпуск сертификата

sudo /usr/share/certbot/certbot-auto certonly --webroot --agree-tos --email email@вашсайт.ru -w /usr/share/nginx/html -d вашсайт.ru -d www.вашсайт.ru

При успешной проверке и генерации ваш сертификат будет лежать в каталоге /etc/letsencrypt/live/вашсайт.ru.

Подключение сертификатов

Осталось указать пути до сертификатов в секции server конфигурации вашего сайта в Nginx

server {
        listen                       443 ssl;
        server_name                  вашсайт.ru       www.вашсайт.ru;
...
        ssl                          on;
        ssl_protocols                TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers                  RC4:HIGH:!aNULL:!MD5:!kEDH;
        ssl_session_cache            shared:SSL:10m;
        ssl_prefer_server_ciphers    on;

        ssl_certificate              /etc/letsencrypt/live/вашсайт.ru/fullchain.pem;
        ssl_certificate_key          /etc/letsencrypt/live/вашсайт.ru/privkey.pem;
        ssl_trusted_certificate      /etc/letsencrypt/live/вашсайт.ru/chain.pem;
...
}

После перезагрузки Nginx страницы сайта за https:// получат заветный зеленый замочек в браузере валидного сертификата.

Продление сертификатов

Сертификаты Letsencrypt.org выдаются сроком на три месяца, поэтому нужно добавить в crontab команду обновления и продления сертификата. Открываем настройки системного крона

sudo nano /etc/crontab

и добавляем команду, запускающую каждый первый день месяца обновление сертификата

0 10 1 * *      root    /usr/share/certbot/certbot-auto renew > /dev/null 2>&1

3. Переезд Wordpress на HTTPS

Используйте нижеприведенный конфиг для Wordpress на Nginx+PHP-FPM, который принудительно открывает все страницы блога по https, используя подготовленные сертификаты Letsencrypt.org

sudo nano /etc/nginx/sites-available/вашсайт.ru

Код конфига

server {
        listen          80;
        server_name     вашсайт.ru www.вашсайт.ru;

        access_log      /usr/share/nginx/logs/nginx.access.log;
        error_log       /usr/share/nginx/logs/nginx.error.log info;

        if ($request_method !~ ^(GET|HEAD|POST)$ ) {
                return 444;
        }

        location /.well-known {
                root /usr/share/nginx/html;
        }

        location / {
                return 301 https://$server_name$request_uri;
        }
}

server {
        listen          443 ssl;
        server_name     вашсайт.ru www.вашсайт.ru;

        ssl                          on;
        ssl_protocols                TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers                  RC4:HIGH:!aNULL:!MD5:!kEDH;
        ssl_session_cache            shared:SSL:10m;
        ssl_prefer_server_ciphers    on;

        ssl_certificate              /etc/letsencrypt/live/вашсайт.ru/fullchain.pem;
        ssl_certificate_key          /etc/letsencrypt/live/вашсайт.ru/privkey.pem;
        ssl_trusted_certificate      /etc/letsencrypt/live/вашсайт.ru/chain.pem;

        root    /usr/share/nginx/html;
        index index.php;

        client_max_body_size 1000M;

        gzip_vary on;

        access_log      /usr/share/nginx/logs/nginx.ssl.access.log;
        error_log       /usr/share/nginx/logs/nginx.ssl.error.log info;

        if ($request_method !~ ^(GET|HEAD|POST)$ ) {
                return 444;
        }

        if ($server_name ~* www\.(.*)) {
                set $host_without_www $1;
                rewrite ^(.*)$ http://$host_without_www$1 permanent;
        }

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

        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param HTTPS on;

            fastcgi_split_path_info ^(.+\.php)(/.+)$;

            include fastcgi_params;

            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }

        location ~ /\. {
                deny all;
        }

        location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico)$ {
                access_log      off;
                expires         max;
        }

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }
}

После этого еще раз перезагрузите Nginx и добавьте HTTPS-версию сайта в Яндекс.Вебмастер и Google Webmaster Tools.

on nginx, php, https, SSL, letsencrypt, wordpress