Thank you for reading this post, don't forget to subscribe!
Lets Encrypt - сертификационный центр, который выдает бесплатные SSL (TLS) сертификаты. Проект был поддержан большим числом IT-компаний, в связи с чем, выданные сертификаты поддерживаются многими операционными системами (есть доверие к центру сертификации). Начало работы — декабрь 2015 года. Официальный сайт — letsencrypt.org.
Ключи выдаются сроком на 90 дней. Есть возможность получить сертификат как в ручном режиме, так и автоматическом (с помощью утилиты certboot). Штатно, процесс получения реализован на системах UNIX, а под Windows есть неофициальная утилита, которая также позволит получить и/или обновить сертификат. Во время установки сертификата для домена, центр Let’s Encrypt проверяет, что мы являемся легитимным владельцем последнего — для этого выполняется http-запрос к сгенерированному файлу на нашем веб-сервере и если он может обработать такой запрос, значит мы имеем право на использование домена.
Область применения данных сертификатов такая же, как у платных, например, для веб-серверов Nginx и Apache или для почтовой системы. Однако, нужно запрашивать ключи для указанных явно доменов (можно несколько в одном сертификате), в отличие от Wildcard (все поддомены).
На текущий момент накоплено много положительных примеров использования данного сертификата. По отзывам, из минусов отмечены:
- Маленький период действия (хорошо, что есть возможность автоматического продления).
- Нет поддержки поддоменов.
- Не работает для Ipv6.
Плюсы:
- Бесплатно.
- Высокая степень защиты.
Условия получения бесплатного сертификата от Let's Encrypt
Прежде чем начать, необходимо знать о некоторых нюансах получения сертификата Let's Encrypt:
- При запросе выполняется проверка домена. Для этого необходимо:
- либо создать TXT-запись в DNS.
- либо поднять веб-сервер, далее в его корне создается каталог .well-known, а в нем файл с произвольным названием. После корневой центр отправляет запрос серверу на загрузку данного файла и, в случае успеха, выдает сертификаты для указанного доменного имени.
- SSL-сертификат выдается на 90 дней, поэтому необходимо по расписанию запускать команду на автоматическое продление ключа. Когда проходит 60 дней после начала использования нового сертификата, центр Let's Encrypt может выдать новый.
- Если выполнять запрос для домена 3 уровня и выше, он должен пройти DNS проверку на всех уровнях. Например, домен layer3.layer2.com должен отвечать на запросы как для layer3.layer2.com, так и для layer2.com.
Проверка домена
Как было сказано выше, для получения бесплатного сертификата, Let's Encrypt должен удостовериться, что мы являемся владельцем домена. Свое право на его владение мы можем подтвердить, создав специальную TXT-запись или настроив веб-сервис, который будет отвечать на запросы.
Настройка веб-сервера
Данный способ немного сложнее для Linux (для Windows все настройки делает утилита автоматически), но позволяет без проблем настроить автоматическое продление.
Запрашивать сертификат Let's Encrypt проще всего с веб-сервера, на котором запущен сайт для домена. Возможен альтернативный вариант с монтирование сетевой папки, но его рассматривать не будем.
Linux
Пример простого конфигурационного файла для NGINX:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 |
server { listen 80; server_name test.ru; root /usr/share/nginx/html; } |
[/codesyntax]
* где test.ru — домен, для которого работает сайт и для которого мы будем запрашивать сертификат; /usr/share/nginx/html — путь по умолчанию для nginx.
Если сервер уже используется для сайта, в секцию server добавляем:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 |
location ~ /.well-known { root /usr/share/nginx/html; allow all; } |
[/codesyntax]
* данными строчками мы говорим, что для всех запросов после /.well-known необходимо отдавать скрипты из каталога /usr/share/nginx/html; allow all предоставляет доступ всем.
При необходимости выполнять проверку и использовать rewrite/return, добавляем что-то подобное:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 |
... location ~ /.well-known { root /usr/share/nginx/html; allow all; } if ($uri !~ /.well-known){ rewrite ^ https://…; } |
[/codesyntax]
После проверяем конфигурацию и перезапускаем nginx:
nginx -t
service nginx reload
С помощью записи в DNS
Данный метод проще, описанного выше, но он позволит настроить автоматическое продление сертификата только для некоторых DNS, для которых есть отдельные certbot-плагины. Поэтому данный способ, в большинстве случаев, будет удобен для проведения тестов.
У нас должна быть возможность управления записями в DNS. На данном этапе достаточно просто зайти в панель управления DNS и перейти к этапу получения сертификата (ниже по тексту). Если домен новый и был только-что делегирован на DNS, возможно, придется подождать, пока он не станет доступен для всех серверов DNS в глобальной сети.
Установка утилиты для получения сертификата
Certbot для Linux
на CentOS 7:
yum install certbot
на CentOS 6:
Создадим каталог, в котором будет храниться утилита и переходим в него:
mkdir /opt/certbot
cd /opt/certbot
Загружаем утилиту и разрешаем ее запуск:
wget https://dl.eff.org/certbot-auto
chmod a+x ./certbot-auto
Для удобства, делаем симлинк:
ln -s /opt/certbot/certbot-auto /opt/certbot/certbot
* при первом запуске certbot он автоматически предложит доустановить необходимые зависимости.
LetsEncrypt-Win-Simple для Windows
На сайте GitHub скачиваем win-acme. Распаковываем архив.
Первое получение сертификата
1. Если мы подтверждаем право на домен при помощи веб-сервера, выполняем такую команду:
certbot certonly --webroot --agree-tos --email postmaster@test.ru --webroot-path /usr/share/nginx/html/ -d test.ru -d www.test.ru
* где для двух команд:
- certonly — запрос нового сертификата;
- manual — проверка домена вручную.
- preferred-challenges — указывает метод проверки домена.
- webroot — проверка будет выполняться на основе запроса к корню сайта;
- agree-tos — даем согласие на лицензионное соглашение;
- email — почтовый адрес администратора домена;
- webroot-path — каталог в системе Linux, который является корневым для сайта;
- d — перечисление доменов, для которых запрашиваем сертификат.
После успешного выполнения команды, сертификаты будут созданы в каталоге /etc/letsencrypt/archive/test.ru, а также симлинки на них в каталоге /etc/letsencrypt/live/test.ru. При настройке приложений, стоит указывать пути до симлинков, так как при обновлении файлы в первом каталоге будут меняться, во втором — нет. Публичный ключ будет с именем cert.pem, а приватный — privkey.pem.
2. При подтверждении права на домен с TXT-записью:
certbot certonly --manual --agree-tos --email postmaster@test.ru --preferred-challenges=dns -d test.ru -d www.test.ru
На запрос подтверждения отвечаем Y — система выдаст что-то на подобие:
Please deploy a DNS TXT record under the name
_acme-challenge.test.ru with the following value:
W2SC9b88y2j2oUjhxVgS7Bphph9g5PqhkBq9KiWkLTm
Once this is deployed,
* Данное сообщение говорит, что мы должны создать TXT-запись _acme-challenge.test.ru со значением W2SC9b88y2j2oUjhxVgS7Bphph9g5PqhkBq9KiWkLTm.
Создаем соответствующую запись в панели управления DNS, и в консоли сервера нажимаем Enter для продолжения. Если, как в данном примере, мы запрашиваем сертификат для нескольких узлов, повторяем действия.
Автоматическое продление
Смотрим полный путь до скрипта certbot:
which certbot
Открываем на редактирование cron и добавляем следующее:
crontab -e
0 0 * * 1,4 /bin/certbot renew
* в данном примере проверка и продление сертификата будет выполняться по понедельникам и четвергам (1,4) в 00:00. /bin/certbot — путь, который мне выдала команда which certbot.
Команда certbot renew проверяет для всех наших сертификатов срок окончания, и если осталось менее 30 дней, запрашивает новый, сохраняет его в каталоге /etc/letsencrypt/archive/<домен> и обновляет симлинк.
Стоит иметь ввиду, что многие приложения, использующие сертификат, потребуют перезапуска, чтобы перечитать его. Поэтому хорошей идеей будет не просто обновлять сертификат, но и перезапускать сервис, который использует сертификат. Например, для NGINX:
0 0 * * 1,4 /bin/certbot renew && systemctl restart nginx
Wildcard
С марта 2018 года появилась возможность получить бесплатный сертификат на все поддомены, например, mail.test.ru, test.test.ru, admin.test.ru (*.test.ru).
Особенности получения Wildcard от Let's Encrypt:
- Подтвердить право использования доменом можно только с помощью DNS — таким образом, затрудняется процесс автоматического продления. Нужно использовать плагины, которые позволяют автоматически создавать нужную запись на DNS, но они доступны далеко не для всех поставщиков услуг DNS. В противном случае, обновлять Wildcard нужно вручную.
Также, некоторые панели управления хостингом, например ISP Manager с версии 5 могут управлять процессом получения Wildcard от Let's Encrypt с возможностью автоматического продления (но необходимо, чтобы домен обслуживался на данном хостинге). - Время действия сертификата также ограничена 3 месяцами.
Certbot
Необходимо, чтобы версия утилиты certbot была 0.22.0 и выше. Проверить текущую версию можно командой:
certbot --version
… если версия ниже, обновляем ее командами:
для CentOS / Red Hat:
yum update certbot
Процесс получения
Процесс очень похож на процесс получения сертификата с подтверждением домена в DNS.
Вводим команду:
certbot certonly --manual --agree-tos --email master@test.ru --server https://acme-v02.api.letsencrypt.org/directory --preferred-challenges=dns -d test.ru -d *.test.ru
* обратим внимание на 2 детали: 1) мы добавили опцию server, чтобы указать, на каком сервере Let's Encrypt должна проходить проверка DNS; 2) мы получаем сертификат как для *.test.ru, так и самого test.ru, так как первое не включает второго.
… система попросит создать TXT-запись в DNS, который обслуживает наш домен:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please deploy a DNS TXT record under the name _acme-challenge.test.ru with the following value: DN8ovKFJ0leLQV9ofZ81mYKxojwIaed5g6f0bXZCYiI Before continuing, verify the record is deployed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
[/codesyntax]
* в данном примере система попросила создать TXT-запись _acme-challenge.test.ru со значением DN8ovKFJ0leLQV9ofZ81mYKxojwIaed5g6f0bXZCYiI.
Заходим в панель управления DNS и создаем нужную запись. Если у нас свой сервер DNS, например, bind, то строка будет такой:
; TXT
_acme-challenge IN TXT DN8ovKFJ0leLQV9ofZ81mYKxojwIaed5g6f0bXZCYiI
Не торопимся нажимать Enter — после настройки DNS нужно немного времени (пару минут), чтобы настройка применилась. Проверить появление записи можно командой с рабочего компьютера:
nslookup -type=txt _acme-challenge.test.ru 8.8.8.8
Как только видим, что настройки применились, нажимаем Enter — если это наш первый запрос Wildcard для данного домена, то система нас попросит создать еще одну запись — повторяем процедуру, создав в DNS вторую запись TXT.
Если все сделали правильно, то увидим:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 |
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/test.ru/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/test.ru/privkey.pem Your cert will expire on 2019-09-05. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le |
[/codesyntax]
сертификат получен.