Бесплатные 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.
Стоит отметить, что сейчас проект находится на стадии бета-тестирования, поэтому могут возникать ошибки в работе их скриптов.
Весь процесс работы с сервисом происходит с помощью 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. Правда в этом случае для правильной настройки веб-сервера необходимо будет вручную переместить все файлы на сервер.