Let’s Encrypt — это сервис, который предоставляет бесплатные SSL-сертификаты через автоматизированный API. Самый популярный клиент Let’s Encrypt — Certbot от EFF.
В Certbot существуют разные способы проверки домена, получения сертификатов, автоматической настройки Apache и Nginx. В этом туториале мы рассмотрим автономный режим (standalone mode) Certbot и как с помощью него защитить другие сервисы: почтовый сервер или брокер сообщений (например RabbitMQ).
Мы не будем вникать в детали конфигурации SSL, но по окончании работы у вас будет действующий сертификат, который автоматически обновляется. Вы также сможете автоматизировать перезапуск сервиса для загрузки обновленного сертификата после его апдейта.
Требования
Для выполнения этого мануала вам понадобится:
- Сервер Ubuntu с пользователем sudo и базовой настройкой брандмауэра, это подробно описано в мануале по конфигурации сервера Ubuntu.
- Домен, который указывает на ваш сервер. В этом туториале он будет называться условно your_domain.
- Порт 80 или 443 не должны использоваться на вашем сервере. Если сервис, который вы хотите защитить, находится на машине с веб-сервером и он занимает оба этих порта, вам нужно будет использовать другой режим Certbot, например webroot.
1: Установка Certbot
Устанавливать Certbot рекомендуется с помощью snap-пакета. Пакеты snap совместимы практически со всеми дистрибутивами Linux, но для управления этими пакетами сначала необходимо установить snapd. В Ubuntu он уже есть по умолчанию, поэтому первым делом нужно проверить, что ядро snapd обновлено до последней версии:
sudo snap install core; sudo snap refresh core
Если вы работаете на сервере, на котором стоит старая версия certbot, то ее следует удалить:
sudo apt remove certbot
После этого можно установить пакет certbot:
sudo snap install --classic certbot
Далее необходимо создать симлинк на команду certbot из каталога установки snap с вашим путем, чтобы можно было просто запустить ее командой certbot. Это нужно не для всех пакетов, но по умолчанию snap-пакеты работают в изолированном режиме, который позволяет избежать конфликтов с другими системными пакетами:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Certbot установлен, теперь давайте запустим его, чтобы получить сертификат.
2: Запуск Certbot
Certbot должен ответить на криптографический вызов от API Let’s Encrypt, чтобы подтвердить, что это наш домен. Для этого он использует порты 80 (HTTP) или 443 (HTTPS). Откройте их в брандмауэре:
sudo ufw allow 80
sudo ufw allow 443
Rule added Rule added (v6)
Чтобы получить сертификат, мы запустим Certbot с опцией –standalone, которая указывает клиенту обработать запрос с помощью встроенного веб-сервера. С помощью флага -d мы задаем домен, для которого запрашивается сертификат. Вы можете добавить несколько опций -d для охвата нескольких доменов в одном сертификате.
sudo certbot certonly --standalone -d your_domain
При запуске команды вам будет предложено ввести имейл и согласиться с условиями обслуживания. После этого вы получите сообщение об успешном завершении процесса, в котором также будет указано, где хранятся ваши сертификаты:
IMPORTANT NOTES: Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-10-02. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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
Теперь у вас должны быть сертификаты. На следующем этапе мы проверим некоторые из загруженных нами файлов и узнаем об их функциональности.
3: Настройка приложения
Мы не будем рассматривать настройку приложения для SSL в этой статье, поскольку каждое приложение имеет разные требования и параметры. Давайте просто посмотрим, что загрузил Certbot. С помощью ls выведем содержимое каталога, в котором хранятся ключи и сертификаты:
sudo ls /etc/letsencrypt/live/your_domain
cert.pem chain.pem fullchain.pem privkey.pem README
README файл из этого каталога содержит подробную информацию о каждом из этих файлов. Как правило, вам понадобятся только два из них:
- privkey.pem: это закрытый ключ сертификата. Он должен храниться в надежном месте, поэтому большая часть каталога /etc/letsencrypt имеет ограниченные разрешения и доступна только пользователю root. Конфигурации большинства программ будут ссылаться на этот файл как на ssl-certificate-key или ssl-certificate-key-file.
- fullchain.pem: это сертификат, объединенный со всеми промежуточными сертификатами. Большинство программ будут использовать этот файл в качестве фактического сертификата и ссылаться на него в своей конфигурации как на ssl-certificate.
Для получения дополнительной информации о других файлах обратитесь к разделу “Where are my certificates” в документации Certbot.
Некоторым программам нужны сертификаты в других форматах, местах или с другими правами доступа.
Права доступа в каталоге letsencrypt желательно не менять (они все равно будут перезаписаны при апдейте), но в некоторых случаях изменение этих прав может быть необходимо. Тогда вам нужно написать скрипт, который будет перемещать файлы и менять разрешения по мере необходимости. Этот скрипт нужно будет запускать каждый раз, когда Certbot обновляет сертификаты, об этом мы и поговорим далее.
4: Настройка автоматического продления Certbot
Сертификаты Let’s Encrypt действительны только 90 дней. Это сделано для того, чтобы пользователи автоматизировали процесс обновления своих сертификатов. Установленный нами пакет certbot позаботится об этом за нас, он добавит скрипт апдейта в /etc/cron.d. Этот скрипт запускается дважды в день и обновляет любой сертификат, срок действия которого истекает через 30 дней.
Поскольку сертификаты обновляются автоматически, нужно найти способ запуска других задач после апдейта. Чтобы установить новые сертификаты, нам нужно как минимум перезапустить или перезагрузить сервер и, как мы упоминали в пункте 3, нам может потребоваться изменить файлы сертификатов таким образом, чтобы они работали с нашим программным обеспечением. Для этого в Certbot существует опция renew_hook.
Чтобы добавить renew_hook, мы изменим конфигурационный файл обновления Certbot. Certbot запоминает все детали того, как вы впервые получили сертификат, и будет запускаться с теми же опциями при апдейте. Нам просто нужно добавить hook. Откройте файл с помощью любого редактора:
sudo nano /etc/letsencrypt/renewal/your_domain.conf
Откроется текстовый файл с некоторыми опциями. В последней строке можно поместить hook, который перезагрузит все веб-сервисы и принудительно применит обновленный сертификат:
renew_hook = systemctl reload your_service
Измените приведенную выше команду так, как вам нужно, чтобы перезагрузить сервер или запустить скрипт для обработки файлов. Обычно в Ubuntu для перезагрузки сервиса используется systemctl. Сохраните и закройте файл, затем сделайте тестовый запуск Certbot, чтобы убедиться, что синтаксис в порядке:
sudo certbot renew --dry-run
Если команда не обнаружит никаких ошибок, то все готово к использованию. Certbot настроен на обновление и выполнение любых необходимых команд, чтобы сервис своевременно подтягивал новые сертификаты.
Подводим итоги
В этом туториале мы установили клиент Let’s Encrypt под названием Certbot, загрузили SSL-сертификат в автономном режиме и включили автоматическое обновление с помощью hook-ов. Это даст вам возможность начать использовать сертификаты Let’s Encrypt с другими службами помимо вашего обычного веб-сервера.
Для получения дополнительной информации обратитесь к документации Certbot.