Let's Encrypt для шифрования соединения в Nginx

Let’s Encrypt - бесплатный, открытый и автоматизированный центр сертификации, который уже выдал более 5 млн сертификатов. Основные преимущества включают:

  • Бесплатность;
  • Автоматизация для настройки и обновления сертификата;
  • Защищенность — используются лучшие практики TLS;
  • Прозрачное использование — публичные записи о полученных и возобновленных сертификатах;
  • Открытый код для внедрения в большое количество сервисов и систем.
Let's Encrypt Nginx

Let's Encrypt предоставляет упрощенный способ получения сертификата для включения зашифрованного соединения с веб-сервером (веб-сайтом). Сервис как-раз и нужен, чтобы включить TLS. Примечательно, что процесс получения и установки сертификата на Apache полностью автоматизирован, поэтому мы рассмотрим установку, настройку и использование Let’s Encrypt на Nginx и Ubuntu.

У Let's Encrypt также есть свои минусы. Во-первых, сертификаты выдаются всего на 90 дней. Сертификаты на более длительный срок не предусмотрены. Во-вторых, сервис всего 2 месяца назад вышел из статуса беты в продакшн. В-третьих, для получения сертификатов используется множество зависимостей и плагинов. Само по себе это не страшно, но когда приходится обновлять сертификат каждые 3 месяца, неизбежно появятся проблемы. Кроме всего прочего, Let's Encrypt все еще находится в активной разработке, так что баги и ошибки неизбежны.

Если "за" перевешивают все "против", то можно приступать к установке и настройке.

Установка клиента

Для начала нужно выбрать клиент Let’s Encrypt. Основатели проекта рекомендуют использовать Certbot, но вы можете взять любой из альтернативных клиентов.

Let’s Encrypt присутствует в пакетах ОС, так что для установки нужно выполнить:

$ sudo aptitude install letsencrypt

# В новых версиях в пакеты будет входить как certbot

Клиент доступен для различных ОС и веб-серверов, его также можно собрать из исходников:

wget https://dl.eff.org/certbot-auto
chmod a+x ./certbot-auto
./certbot-auto --help

# Используются существующие и дополнительные зависимости в виртуальной среде Python

Получение сертификата

Let’s Encrypt выдает сертификаты при помощи различных клиентов и методов. К сожалению, полноценный плагин для Nginx пока экспериментальный, поэтому не всегда работает корректно и приводит к сбоям веб-сервера. Если вы готовы к проблемам, то нужно собрать Certbot с исходников на GitHub, затем установить плагин Nginx и использовать его как опцию --nginx.

Но на данном этапе рекомендуется использовать плагин Webroot.

Использование плагина Webroot

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

${webroot-path}/.well-known/acme-challenge

# Не забудьте настроить сервер для раздачи файлов из скрытых директорий

А сервер валидации проверяет их в виде:

66.133.109.36 - - [05/Jan/2016:20:11:24 -0500] "GET /.well-known/acme-challenge/HGr8U1IeTW4kY_Z6UIyaakzOkyQgPr_7ArlLgtZE8SX HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"

# Проверяет, что DNS для запрашиваемого домена ведет на сервер с certbot

Желательно отредактировать файл настроек сайтов Nginx /etc/nginx/sites-available/default:

location ~ /.well-known {
                allow all;
        }

# Нужно добавить в блок server с включенным TLS

После этого можно получить сертификат:

$ letsencrypt certonly --webroot -w /var/www/somesite -d somesite.com -d www.somesite.com -w /var/www/other -d other.somesite.net

# Получение сертификатов и размещение их в директориях

Рассмотрим команду подробнее:

  • letsencrypt certonly --webroot — базовая команда для получения сертификата с использованием плагина webroot;
  • -w — указывает директорию верхнего уровня (web root);
  • -d — домены, для которых нужно получить сертификат.

Запустится процесс получения, нужно будет указать e-mail для восстановления, принять условия использования. Сообщение об успешном получении будет выглядеть так:

Output:
IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to user@somesite.com
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your
   cert will expire on 2016-09-15. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.
 - If like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

# Кроме дополнительной информации, указывает путь к файлам сертификации

В директории /etc/letsencrypt/live/your_domain_name будут лежать такие файлы:

  • Cert.pem — сертификат домена;
  • Chain.pem — цепочка сертификата Let’s Encrypt;
  • Fullchain.pem — комбинация cert.pem и chain.pem;
  • Privkey.pem — личный ключ сертификата.

Включение TLS/SSL в Nginx

Теперь можно настраивать и оптимизировать TLS в Nginx. И не забывайте делать 301 редирект с незащищенного http:// на защищенный https://. Дополнительно можно сгенерировать группу по протоколу Диффи-Хеллмана:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

# Используется библиотека openssl и 2048-битное шифрование

Автоматическое обновление сертификата

Учтите, что сертификаты Let’s Encrypt выдаются только на 90 дней. Поэтому рекомендуем настроить автоматическое обновление сертификатов. Для этого нужно поместить команду в crontab или systemd:

sudo crontab -e
* * 30 * * letsencrypt renew >> /var/log/le-renew.log

# Автоматическая проверка и обновление сертификата каждые 30 дней

Самое главное

Обязательно включайте и оптимизируйте TLS на веб-сервере. А Let’s Encrypt поможет получать проверенные сертификаты быстро и бесплатно.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень