Настройка Let's Encrypt для nginx. Установка бесплатного SSL сертификата

3 октября, 2021 13:15
Admin
19 июня, 2022 8:25

Let’s Encrypt — это бесплатный, автоматизированный и открытый Центр Сертификации. Благодаря ему нет необходимости в покупке SSL сертификата, поскольку он позволяет получить SSL сертификат для вашего домена совершенно бесплатно. Кроме того, получение и настройка осуществляется один раз и навсегда. Нет необходимости каждый 1-2 года покупать или обновлять сертификат, все это за вас сделает Certbot.

Установка Certbot в Ubuntu

Для установки Certbot может потребоваться сначала установить систему управления пакетами - snap, если у вас она еще не установлена. Чтобы установить snap выполняем следующие команды:

apt update
apt install snapd
snap install core

После установки snap мы можем установить Certbot:

snap install --classic certbot

Затем создадим символическую ссылку:

ln -s /snap/bin/certbot /usr/bin/certbot

Установку можно также осуществлять через apt (advanced packaging tool):

apt install certbot

Но установка через snap позволит получить более свежую и стабильную версию.

Настройка Certbot

В качестве настройки будем использовать метод webroot без остановки веб-сервера. Согласно протоколу ACME нам потребуется каталог, в который certbot будет писать файлы, которые будут доступны удостоверяющему серверу из сети.

В файле /etc/letsencrypt/cli.ini необходимо указать основные настройки:

authenticator = webroot
webroot-path = /var/www/certbot
post-hook = nginx -s reload

При успешном обновлении сертификатов будет выполнена команда из post-hook. В нашем случае мы перезагрузим nginx.

При указании данных настроек certbot должен создавать файлы, необходимые для проверки прав на домен в каталоге /var/www/certbot. Целевой путь будет выглядеть примерно следующим образом:

/var/www/certbot/.well-known/acme-challenge/test.html

Поэтому такие файлы должны быть доступны из сети на целевом домене по крайней мере по HTTP:

http://example.com/.well-known/acme-challenge/test.html

Для этого нам потребуется настроить наш веб-сервер. В качестве тестирования мы можем создать файл:

mkdir -p /var/www/certbot/.well-known/acme-challenge
echo "Test" > /var/www/certbot/.well-known/acme-challenge/test.html

Настройка конфигурации Nginx

В качестве настройки потребуется установить в блоке server следующую запись:

location /.well-known {
   root /var/www/certbot;
}

После этого нам необходимо перезапустить nginx и убедиться, что наш тестовый файл доступен:

curl -L http://example.com/.well-known/acme-challenge/test.html

После проверки лучше удалить наш тестовый файл, чтобы certbot не показывал сообщение об ошибке (Unable to clean up challenge directory). И теперь мы можем приступать к получению сертификатов.

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

Поскольку у Let's Encrypt есть лимиты на количество обращений за сертификатами, лучше всего для начала проверить, что сертификаты для целевого домена удастся получить, для этого выполняем команду ниже с флагом --dry-run. Который пытается получить сертификаты в режиме тестов:

certbot certonly --dry-run -d example.com -d www.example.com

Если все прошло успешно и сертификаты могут быть получены команда выведет следующую информацию:

The dry run was successful.

В случае неудачи certbot выведет информацию об ошибке, а также запишет расширенную информацию в лог.

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

При успешном выполнении команды мы можем смело получать сертификаты:

certbot certonly -d example.com -d www.example.com

После этого у вас должны появиться сертификаты для указанных доменов.

Если требуется добавить домен или поддомен в сертификат

Если вы забыли указать поддомен или требуется добавить новый домен в сертификат (необходимо учесть, что их не должно быть больше 100), в этом случае мы можем запустить команду еще раз указав дополнительные домены:

certbot certonly -d example.com -d www.example.com -d test.example.com

Вам будет предложено добавить новый домен в сертификат. Чтобы избежать вопросов можем дописать ключ:

certbot certonly --expand -d example.com -d www.example.com -d test.example.com

После одной из этих команд новый домен будет добавлен в сертификат.

Проверка сертификата

Чтобы проверить только что полученный сертификат мы можем воспользоваться следующим методом:

openssl x509 -text -in /etc/letsencrypt/live/example.com/cert.pem

Команда должна вывести информацию о нашем сертификате, включая список доменов на который данный сертификат распространяется.

Установка сертификата в Nginx

Все выпущенные сертификаты certbot помещает в виде ссылок в каталог с названием первого домена:

/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/chain.pem
/etc/letsencrypt/live/example.com/privkey.pem
/etc/letsencrypt/live/example.com/cert.pem

Таким образом мы можем установить сертификат на домен в nginx следующим образом:

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    # далее ваши настройки
}

После установки сертификата мы можем проверить, что наш сайт работает по защищенному протоколу.

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

Поскольку сертификаты выдаются всего на 3 месяца, необходимо автоматизировать процедуру обновления сертификатов, чтобы не выполнять каждый раз вышеописанные действия. Для этого достаточно добавить в /etc/cron.d/certbot подобную запись:

# добавить в /etc/cron.d/certbot что-то вроде этого
0 */12 * * * root test -x /usr/bin/certbot && perl -e 'sleep int(rand(43200))' && certbot -q renew --allow-subset-of-names

Здесь мы проверяем существование исполняемого файла /usr/bin/certbot, если он есть засыпаем на рандомное время в пределах 43200 секунд (12 часов) и затем обновляем сертификаты. Ключ --allow-subset-of-names нужен чтобы certbot пытался получить сертификаты для частичного набора доменов. Это требуется в том случае, если подтвердить владение одного из ваших доменов не удастся, то certbot получит сертификаты для тех доменов владение которых будет подтверждено, иначе вы получите первую ошибку при проверке владения доменом и на этом все завершиться, certbot не станет получать оставшиеся сертификаты.

На этом все. Наш сертификат установлен и будет обновляться каждые 3 месяца самостоятельно, поэтому нам не потребуется ежегодно покупать и устанавливать платный сертификат.