Как установить бесплатный сертификат SSL от Let's Encrypt на сайт

SSL

В мире WEB наличие сертификата SSL стало практически отраслевым стандартом. Если раньше это было необязательное требование, то сейчас поисковые системы понижают рейтинг сайта при отсутствии сертификата. Некоторые браузеры даже показывают пользователю предупреждение о том, что работа с сайтом может быть небезопасна. И общая тенденция направлена на полный отказ от работы с незащищенным протоколом. В таких условиях для успешного продвижения сайта установка сертификата становится просто обязательной!

Для начала пару слов о том что такое SSL. Протокол SSL (Secure Sockets Layer) обеспечивает защищённый обмен данными. SSL изначально разработан компанией Netscape Communications для своего браузера и впоследствии на его основе был принят стандарт TLS. В конечном итоге был сформирован новый протокол HTTPS (Hypertext Transfer Protocol Secure), поддерживающий шифрование. Для того чтобы сайт мог работать на этом протоколе и требуется установка сертификатов.

Сертификаты выдаются удостоверяющими центрами и за это нужно платить. В зависимости от вида сертификата меняется и его стоимость. И самое печальное - срок действия сертификата всего один-два года. Т.е. постоянно придется платить удостоверяющему центру за перевыпуск сертификата. А что делать тем у кого сайт не является коммерческим проектом и не приносит денег? Неужели платить из своего кармана?

Именно для таких случаев существует удостоверяющий центр Let's Encrypt, который позволяет бесплатно выпустить самый простой сертификат, которого достаточно для перехода с протокола HTTP на защищенный протокол HTTPS.

Lets's Encrypt

Помимо того что с помощью этого удостоверяющего центра можно получить бесплатный сертификат, весь процесс получения и последующего обновления автоматизирован! Нужно будет ввести всего несколько команд в консоли. Ниже будет описан процесс установки сертификата для сервера на базе Ubuntu/Apache. Итак, приступим!

Установка Certbot

Как я уже писал выше весь процесс работы с сертификатами автоматизирован. Для этого существует специальная программа Certbot которую нужно установить. Также нужно установить модуль для работы с сервером Apache. Для других серверов есть другие модули. Все команды должны выполняться от имени root.

apt install certbot
apt install python-certbot-apache

Установка сертификата

Установка нового сертификата предельна проста. Нужно запустить Certbot и указать тип WEB-сервера. В моём случае это Apache.

certbot run --apache

При первом запуске будет предложено ответить на несколько вопросов:

  • Указать адрес почты куда будут приходить информационные письма
  • Принять пользовательское соглашение
  • Согласиться или отказаться сделать e-mail публичным

После этого будет выведен пронумерованный список доменов зарегистрированных на данном сервере. Нужно ввести номер домена для которого требуется выпуск сертификата. Если домен доступен и с префиксом WWW и без него, то нужно указать только тот, который без WWW. Ниже я расскажу о том как добавить к одному сертификату оба варианта.

После этого сертификат будет создан и автоматически установлен на сервер. Конфигурационный файл домена будет дополнен блоком с информацией о сертификате. Останется только перезагрузить конфигурацию Apache чтобы домен стал доступен по протоколу HTTPS.

systemctl reload apache2

Установку сертификата можно произвести и в ручном режиме для конкретного домена. Для этого нужно выполнить следующую команду:

certbot certonly --apache -d mydomain.com

Сертификат будет создан, но блок с информацией о нем придется вручную прописать в конфигурационном файле домена, после чего перезагрузить конфигурацию Apache.

Обновление сертификата

Сертификаты Let's Encrypt выпускаются всего на 3 месяца и их нужно постоянно обновлять. Но и этот процесс автоматизирован. Для обновления всех сертификатов установленных на данном сервере достаточно выполнить следующую команду:

certbot renew

При этом будут обновлены только те сертификаты, у которых истекает срок действия. Благодаря такому удобству можно добавить эту команду в планировщик CRON, чтобы обновление сертификатов запускалось раз в неделю. И тогда можно забыть об этой проблеме вообще!

Для того чтобы это сделать нужно сначала узнать где установлен Certbot:

which certbot

После этого открываем расписание CRON для пользователя root:

сrontab -e -u root

И добавляем туда строку, в которой указываем время запуска и полный путь к программе Certbot, который мы узнали на предыдущем шаге:

0 5 * * 1 /usr/bin/certbot renew

Теперь каждый понедельник в 5 утра обновление сертификатов будет запускаться автоматически.

Помимо автоматического обновления всех сертификатов есть возможность обновить сертификат для конкретного домена в интерактивном режиме. К примеру, для mydomain.com нужно выполнить следующую команду:

certbot certonly -n --apache -d mydomain.com

Замечу, что обновить можно лишь те сертификаты, срок действия которых ещё не закончился. Если у сертификата истек срок действия, то его придется выпустить заново.

Добавление префикса WWW к имени домена

Не смотря на то что префикс доменного имени WWW на сегодняшний день считается атавизмом, его нужно учитывать для правильной работы сайта. Однако после установки сертификата описанным выше способом возникает проблема.

К примеру, имя Вашего домена mydomain.com. Если Вы введете в браузере адрес https://mydomain.com без префикса WWW то увидите Ваш сайт. А если введете адрес https://www.mydomain.com с префиксом WWW, то увидите предупреждение о том, что получен сертификат не принадлежащий этому сайту. Это может стать проблемой для поисковых систем и всевозможных анализаторов, которые требуют чтобы сайт был доступен по протоколам HTTP и HTTPS, с префиксом WWW и без него.

Так происходит потому, что при выпуске сертификата мы указали только первый вариант домена. Фактически доменное имя с префиксом и доменное имя без префикса это два совершенно разных сайта. И теоретически нужно иметь собственный сертификат на каждое имя. Но есть другой способ - включить в один сертификат сразу два домена.

Для этого при создании сертификата нужно выполнить следующую команду:

certbot certonly --apache -d mydomain.com -d www.mydomain.com

Естественно, вместо mydomain.com должно быть имя Вашего сайта. После успешного выпуска сертификата сайт будет открываться и по адресу https://mydomain.com без префикса WWW, и по адресу https://www.mydomain.com с префиксом.

Автоматический редирект с HTTP на HTTPS

Поскольку теперь Ваш сайт работает на защищенном протоколе HTTPS больше нет необходимости показывать пользователям его незащищенную версию. Поисковые системы видя один и тот же сайт на разных протоколах будут считать их разными сайтами с одинаковым содержимым. Это может негативно сказаться на ранжировании в поисковой выдаче. В идеале сайт должен быть доступен по обоим протоколам HTTP и HTTPS, с префиксом WWW и без него, но при этом должен происходить редирект только на один вариант сайта. Ниже приведен один из возможных вариантов редиректа для сайта mydomain.com:

http://mydomain.com → https://mydomain.com

http://www.mydomain.com → https://mydomain.com

https://www.mydomain.com → https://mydomain.com

Как видите во всех случаях будет открываться только https://mydomain.com. Добиться этого можно изменив файл htaccess в корне сайта. Для редиректа с протокола HTTP на HTTPS:

RewriteEngine On

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Для редиректа с адреса с префиксом WWW на адрес без префикса WWW:

RewriteCond %{HTTP_HOST} ^www.mydomain.com$ [NC]
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L]

Во всех случаях будет выполняться 301 редирект, который обозначает что страница более недоступна по указанному адресу.

Нужно учесть, что после таких изменений для поисковых систем ранее проиндексированные страницы станут недоступны, и может понизиться ранжирование сайта. Чтобы этого не произошло нужно оповестить Google и Яндекс о появлении новой версии сайта. Это можно сделать через консоль вебмастера. Роботы проиндексируют сайт и со временем в поиске окажутся только новые страницы.

Также нужно позаботиться о том, чтобы весь контент сайта был доступен по протоколу HTTPS. Часто добавляя внутреннюю ссылку указывают полный путь http://mydomain.com/images/image.jpg. После того как Вы измените протокол сайта ссылка будет работать, однако браузер будет показывать пользователю предупреждение о том, что не весь контент на сайте доступен через защищенный протокол. Во избежании этого Вы должны позаботиться о том, чтобы все внутренние ссылки были вида /images/image.jpg. В этом случае таких проблем не будет.