Как перевести сайт на https бесплатно

Рассказываю на примере этого блога (bablofil.ru), перевод был осуществлен 26.12.2016 года, операция заняла около часа, с лечением подводных камней.

Этот способ подойдет тем, кто имеет доступ к конфигурационным файлам своего веб-сервера (здесь используется Nginx, и его конфигурацию я буду приводить в пример, хотя для Apache тоже будет работать, но конфиги придется крутить отдельно).

Сайт использует движок  Wordpress, и в силу своих особенностей иногда это является проклятьем, тем более когда не хочешь ставить лишние плагины.

Сайт укрыт за CDN Cloudflare, и именно благодаря ему сертификат получен бесплатно (что это и зачем опишу отдельной статьей, если не знаете, погуглите и перенесите сайт туда, вещь хорошая).

Update: На следующий день сайт перестал открываться из-за CloudFlare )) Вместо шага 1 берите бесплатный сертификат на https://www.startssl.com, потом переходите к шагу два.

 

Шаг 1. Получаем сертификат на Cloudflare.

Логинимся (cloudflare.com), переходим на вкладку Crypto

Проматываем вниз, находим кнопку Create Certificate

Здесь можно ничего не менять, достаточно нажать кнопку Next

Заметили, ваш сертификат будет валиден в течении 15 лет:)
При выборе спрашивает, для какого сайта выдавать сертификат, я создавал для bablofil.ru.

Появится окно, в котором будет выведено содержимое сертификата и закрытого ключа, скопируйте текст из каждого раздела в отдельные текстовые файлы, неважно как вы их назовете, я называл “cert” для сертификата и “priv” для ключа.

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

Шаг 2. Настройка Nginx для работы с https

Перенесите созданные файлы на сервер, и припрячьте – почему-то в мануалах пишут, положите в папку с сайтом, я считаю это не очень безопасным, поэтому складываю в папки, которые к вебу отношения не имеют. Пусть в данном случае это будет папка /opt/certificates/.

Правим конфиг Nginx – у меня это /etc/nginx/sites-available/bablofil.ru.

В секции server – где сейчас настроен порт 80,  меняем порт на 443 и добавляем строки

ssl        on;
ssl_certificate         /opt/certificates/cert
ssl_certificate_key     /opt/certificates/priv;

 

Также, для себя я решил, что ВЕСЬ трафик будет идти через https, поэтому я хочу все запросы, приходящие на http отправлять на https, для этого я добавляю вторую секцию с портом 80, которая будет редиректить на https.

Окончательный конфиг выглядит так (да, две секции server в одном файле, если кто не знает):

server {
    listen      80;
    server_name bablofil.ru;
    rewrite     ^   https://$server_name$request_uri? permanent;
}


server {
    listen 443;

    root /some_path/bablofil;
    index index.php index.html index.htm;
    client_max_body_size 96M;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    server_name bablofil.ru;
    ssl        on;
    ssl_certificate         /opt/certificates/cert;
    ssl_certificate_key     /opt/certificates/priv;

    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

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

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index  index.php;
        try_files $uri =404;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Обратите внимание на строку add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; , это включает HSTS  - механизм, активирующий форсированное защищённое соединение через протокол HTTPS. Google любит этот заголовок, да и вообще его рекомендуется указывать. В конце строки еще можно указать слово always, но это зависит от используемой версии Nginx.

Кстати, да, Worpdress работает на php7.0, если кому интересно, расскажу.

Рестартуем Nginx.

На этом этапе у вас уже должен работать https, но значок в адресной строке, скорее всего, остался прежним, потому что у вас (как было и у меня) смешанное содержимое. На странице встречаются ссылки как http://, так и https://, это считается нарушением безопасности, так что все ссылки нужно убрать.

Шаг 3. Настройка Wordpress

Первым делом меняйте ссылки в header.php и footer.php в темах, все, что прописано как http:// меняйте на // (просто два слеша).

Просто два слеша означают, что браузер сам разберется, по какому протоколу сайт открывать. Например, //yandex.ru является вполне валидной ссылкой, все чаще встречаю такие на современных сайтах.

Еще нужно в админке, в общих настройках, поменять http:// на https:// для содержимого новых статей и отображения некоторых картинок. Вот так:

Казалось бы, дело в шляпе, но.. нет, шифрование не работает. Дело в том, что статьи, особенно картинки в них, вордпресс льет в базу в том виде, в каком вы статью создавали – если тогда было http://, значит у вас по всей базе сейчас http://. Сначала я пробовал решить эту ситуацию плагинами, типа force http, потом попробовал заменять слова на этапе обработки темы, но в итоге пошел простым и дуболомным способом: поменял все записи в базе одним запросом.

Подлючаетесь к mysql (можно через phpmyadmin, но у меня консоль), к базе своего сайта, и выполняете запрос

update wp_posts set post_content = REPLACE(post_content, 'http://', '//');

Ура, ошибка mixed content пропала, появился зеленый значок.

Последний шаг

Вернемся на Cloudlfare.com, в том же разделе Crypto включим полное шифрование. Теперь всё готово.

Может быть, что то я сумбурно описал или не раскрыл какой-то момент, задавайте вопросы в комментариях, буду исправляться!

PS Пока писал статью, обнаружил что LiveWriter отвалился, из за смены адреса, пришлось обновлять настройки, так что подумайте, нет ли у вас внешних приложений в которых прописан адрес вашего сайта.





Комментарии


Пожалуйста, авторизуйтесь, что бы оставить свой комментарий