Бесплатные SSL сертификаты от Let’s Encrypt

В прошлом году Google явно дал всем понять, что пора бы уже подключать SSL сертификаты к своим сайтам. Теперь же по-умолчанию предпочтение будет отдаваться сайтам, использующим защищенное соединение. В связи с этим с недавних пор появилась шумиха вокруг бесплатных SSL сертификатов (давно уже пора). При поддержке Linux Foundation, а также Mozilla, Facebook, Akamai, Cisco и многих других именитых гигантов IT индустрии, свет увидел проект под названием Let’s Encrypt.

Проект в первую очередь призван обезопасить веб, а также облегчить жизнь рядовым веб-разработчикам (всю эту возню с генераций приватных ключей, CSR, подтверждением прав на домен, настройкой веб-сервера и так далее свести на нет). Более того, SSL сертификаты, выдаваемые Let’s Encrypt, полностью бесплатные. Есть в них правда одно но, они являются базовыми и срок действия ограничен до 3-х месяцев (но это вовсе не проблема, так как продление можно настроить автоматически).

Скажу сразу, что на свой блог я поставил именно сертификат от Let’s Encrypt.

SSL сертификат от Let's Encypt

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

Весь процесс работы с сервисом происходит с помощью python скрипта letsencrypt, на текущий момент не для всех дистрибутивов linux существуют пакеты letsencrypt, поэтому официальная документация рекомендует ставить его предварительно склонировав git репозиторий из github.

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto --help

letsencrypt-auto это скрипт-обёртка вокруг letsencrypt, автоматизирующий процесс развёртывания. Проще говоря, скрипт скачивает все необходимые зависимости, поднимает отдельное виртуальное окружения для Python, используя virtualenv, устанавливая в него необходимые python-модули при этом не засоряя системный питон. Стоит отметить, что для корректной работы скрипта необходимы права на запись в системные директории (sudo).

Так как скрипт призван максимально упростить работу по установке сертификатов безопасности, он поддерживает систему плагинов. Например, в стандартной поставке имеется плагин для работы с Apache (полноценно функционирующий) и nginx (пока только на экспериментальной стадии).

Установка SSL сертификата для Apache

Мой блог работает на связке LAMP, т.е. Linux, Apache, MySQL и PHP. Разработчики Let’s Encrypt постарались на славу и упростили настройку сертификата для Apache до уровня «проще некуда». Весь процесс сводится к следующим шагам:

$ ./letsencrypt-auto --apache -d mydomain.com

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

  • Проверит принадлежность домена
  • Выпустит необходимый сертификат сроком на 90 дней
  • Внесёт все необходимые настройки для веб-сервера Apache

После всех этих манипуляций мне только оставалось настроить 301 редирект (Moved Permanently) с http на https и перезагрузить веб-сервер.

<VirtualHost *:80>
        ServerName khashtamov.com
        Redirect permanent / https://khashtamov.com/
</VirtualHost>

С настройкой nginx дела обстоят хуже, в первую очередь потому что этот плагин пока не работает в связке с letsencrypt-auto. Если есть необходимость настройки SSL сертификатов для nginx (а она разумеется есть, nginx как ни крути один из самых популярных веб-серверов), то я бы порекомендовал сделать это вручную. О том как, читайте ниже.

Настройка SSL сертификатов для других веб-серверов

В поставке letsencrypt помимо плагина для работы с Apache имеется ряд других, а именно:

  • standalone
  • webroot
  • manual
  • nginx

Standalone

Суть standalone заключается в том, что скрипт попытается поднять собственный веб-сервер на время процедуры получения сертификата (дабы подтвердить принадлежность домена), а для этого необходимо будет отключить уже работающий, дабы освободить порты 80 и 443. Для большинства веб-разработчиков данный вариант неудобен из-за необходимости отключения сайта.

$ ./letsencrypt-auto certonly --standalone -d mydomain.com

Webroot

Данная опция подходит тем, кого не устраивает standalone. При указании ключа —webroot необходимо также будет указать и директорию, где располагаются файлы, которые обрабатывает веб-сервер.

$ ./letsencrypt-auto certonly --webroot -webroot-path /var/www/mydomain/

При работе с данной опцией необходимо настроить веб-сервер на чтение файлов соответствующим образом.

Manual

Из названия можно догадаться, что настройка и установка SSL сертификата будет проводиться вручную 🙂 Пожалуй, сейчас это наиболее удобный вариант настройки сертификата для nginx ввиду «сыроватости» letsencrypt nginx плагина.

$ ./letsencrypt-auto certonly --manual -d mydomain.com

После ввода этой команды вам необходимо будет самостоятельно провести манипуляции по подтверждению домена, разместив файл с определённым содержимым в нужной директории на сайте. Когда процедура создания сертификата закончится, все необходимые файлы будут лежать по следующему пути /etc/letsencrypt/live/$domain. В подкаталоге live находятся все самые актуальные сертификаты и ключи, тогда как keys и archive содержат все ранее созданные файлы.

Настройка SSL в Nginx

Итак, если процедура с созданием сертификатов в manual режиме прошла успешно, то в вышеупомянутой директории мы найдем все необходимые файлы для настройки безопасного соединения.

  • privkey.pem — наш приватный ключ
  • cert.pem — сертификат сервера
  • chain.pem — корневой (root) и промежуточный (intermediate)
  • fullchain.pem — все необходимые нам сертификаты для настройки веб-сервера.

Как же в данном случае будет выглядеть настройка Nginx?


server {
        listen 80;
        listen 443 ssl;
        server_name mydomain.com;

        ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;

...

Ребята из letsencrypt не советуют перемещать файлы, т.к. при продлении сертификата старые будут автоматически заменены новыми по тем же путям, лучше в этом случае создать символически ссылки.

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

Ранее я уже упоминал о том, что бесплатные SSL сертификаты «живут» только 90 дней, поэтому после их истечения необходимо будет запускать процедуру продления, благо это тоже бесплатно 🙂

Что же из себя представляет процесс продления?

Как утверждают в Let’s Encrypt, перед истечением, на почту, указанную при создании, приходит соответствующее письмо-уведомление о том, что пора бы продлить сертификат. Чтобы это сделать вручную достаточно запустить команду:

$ ./letsencrypt-auto

И следовать инструкциям на экране. Автоматическое же продление можно настроить используя конфигурационный файл и обычный crontab. Желательно настроить крон таким образом, чтобы продление происходило не чаще 1 раза в месяц.

Если вы работаете из под Windows, то letsencrypt можно развернуть, используя Vagrant или Docker. Правда в этом случае для правильной настройки веб-сервера необходимо будет вручную переместить все файлы на сервер.

  • Zhassulan Nurushev

    Привет! Спасибо за статью!
    Когда пытался установить вручную на nginx, скрипт не смог собрать библиотеку cryptography. Оказалось проблема в нехватке памяти(было 512мб). Увеличил до 1 гигабайта и все заработало.

  • toporovvv

    Всё хорошо у Летэнкрипта, но есть два минуса, которые пока перечёркивают все плюсы:

    1) Не работает для некоторых пользователей XP: сертификат помечается как не доверенный, ВСЕ браузеры блокируют загрузку. На постсоветском пространстве, к сожалению, XP ещё достаточно распространён (в одном из наших проектов одинаковая доля пользователей с XP и восьмёркой).
    2) Не работает соединение со старой Явой (без SNI), поэтому отваливается интеграция с некоторыми сервисами Яндекса (просто не могут скачать файл, соединение также признаётся небезопасным). Ради вас они свою инфраструктуру обновлять не будут (мой тикет вообще тупо проигнорировали).

    • Про XP не знал. Спасибо за замечание. Но надеюсь у разработчиков и тех, кто интересуется разработкой ПО не возникнут проблемы с доступом на мой сайт 🙂

      • Jared

        Все проблемы с доступом отлично проверяет сервис https://www.ssllabs.com/ssltest/

      • Jared

        По вашему серверу всё замечательно. Как видим, проблемы будут с мёртвым устаревшим андроидом, старинной явой, а так же IE6 и IE8 на XP.

        • Jared

          И да, если настроите заголовок Strict Transport Security (HSTS), у вас будет А+, наивысшая оценка. (OCSP stapling тоже не повредит, кстати)

          • О, спасибо за совет 🙂

    • Jared

      Какие конкретно сервисы?

      • toporovvv

        Яндекс.Недвижимость.

    • Jared

      SNI никаким боком с Let’s Encrypt не связано, эта «проблема» актуальна для SSL вцелом — старые браузеры умеют только один IP — один сертификат, это их проблемы. XP — извините, не надо юзать левые сборки, официальная отлично работает.

      • toporovvv

        Может быть это и не проблема Лэтсэнкрипта, но с обычными платными сертификатами её не возникает.

        Про XP — полностью с вами согласен, но только проблема эта пользователей, а перестают они заходить к вам на сайт, поэтому волей-неволей приходится подстраиваться.

  • Pingback: Как написать Telegram бота: практическое руководство | Персональный блог Адиля Хаштамова()

  • Ребята, сильно не пинайте, только вникаю, «во всё», автор пишет:
    «Мой блог работает на связке LAMP, т.е. Linux, Apache, MySQL и PHP.
    … Весь процесс сводится к следующим шагам:
    $ ./letsencrypt-auto —apache -d mydomain.com
    После ввода этой команды появится окно, где необходимо будет заполнить пару деталей, включая электронный адрес владельца. Остальное скрипт сделает за вас».

    Это где вводится, на VPS/VDS в терминале?
    У меня например тоже LAMP, только на обычном хостинге, где есть доступ по FTP, и вроде как сертификат можно подключить через cPanel, есть «Самоподписанный» и «Существующий», но как получить «Существующий», чтобы подключить его, ни как не пойму..
    Перечитал кучу мануалов, и везде текст начинается после окончания моих знаний, либо понимания, либо опыта. Доступ к корню сайта и ДНСам есть.
    Подскажите, ткните, кто как может, краткий порядок действий на винде и обычном хостинге, чтобы потом залить туда CMS.

    • В статье идёт инструкция с учётом наличия доступа в серверу по SSH (терминал). Что касается cPanel, то советую обратиться к тех.поддержке вашего хостера, так процесс пойдёт куда быстрее.

      • Спасибо друг, получил и прикрутил, от https://www.startssl.com/
        По мануалам хостера, и хостинг бесплатный и сертификат, не ожидал..

        До юниксов не добрался, а на Вин7, хром рисует что надёжный, опера что безопасный, эксплорер — не ясно, фаерфокса времмено нет. На 3 года!!
        Афуеть, учитывая что всё нахаляву и первый раз.

        Скрины:
        https://goo.gl/hGt8oo
        https://goo.gl/gUjPtm