16 октября 2018 г. Nginx SSL Ubuntu TLS HTTPS

Получаем бесплатный SSL/TLS-сертификат от Let's Encrypt и настраиваем Nginx

Сегодня расскажу как получить бесплатный SSL/TLS-сертификат от Let's Encrypt для своих сайтов под Nginx с помощью ACME клиента certbot (программа для получения и обновления сертификата от Let's Encrypt).

Проект Let’s Encrypt создан для того, чтобы большая часть интернет-сайтов смогла перейти к шифрованным подключениям (HTTPS). В отличие от коммерческих центров сертификации, в данном проекте не требуется оплата... продолжить читать на Википедии

Установка зависимостей

Установим certbot и плагин для Nginx, чтобы он сам настроил нужные хосты в Nginx:

apt install certbot python3-certbot-nginx

Получаем сертификат для одного домена

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

certbot --nginx -n --agree-tos -m <Ваш Email> -d <Ваше Доменное Имя>

где:

  • --nginx - Заставляет плагин для Nginx перенастраивать хосты в конфигах Nginx (указывает пути до сертификатов, если нет секции для ssl, то создаст их для указанного домена)
  • -n - Не интерактивный режим, чаще используется для вставки в скрипты деплоя
  • --agree-tos - Согласие с ACME server's Subscriber Agreement (ToS - Terms of service)
  • -m - Ваш Email
  • -d - Ваше доменное имя

Пример:

certbot --nginx -n --agree-tos -m example@example.org -d example.com
certbot --nginx -n --agree-tos -m example@example.org -d or.sub.domain.example.com

Подтверждение прав на домен

Теперь вам необходимо подтвердить права на указанное доменное имя. Для этого можно создать location в конфиге Nginx:

server {
    server_name <Ваше Доменное Имя>;
    location ~* ^/\.well-known/acme-challenge/<AUTH TOKEN BY CERTBOT>/$ {
        return 200;
    }
}

Либо создать TXT-запись для домена, что более удобно:

_acme-challenge.<Ваше Доменное Имя>.  IN TXT "<AUTH TOKEN BY CERTBOT>"

Пример:

_acme-challenge.example.org.   IN TXT "4sV67H271Eil3VHA-9TuXjANP6cP_uXmyJoTInalPaY"

Некоторые подробности можно посмотреть на ServerFault

Получаем Wildcard-сертификат

Если у вас много поддоменов, то проще получить Wildcard-сертификат (на все поддомены), эта возможность появилась у Let’s Encrypt весной 2018 года.

certbot certonly --preferred-challenges=dns --agree-tos -m <Ваш Email> -d *.<Ваше Доменное Имя> -d <Ваше Доменное Имя> --manual --server https://acme-v02.api.letsencrypt.org/directory

где:

  • certonly - Получить только сертификат (но не устанавливать/применять его)
  • --preferred-challenges - Подтверждение прав на домен удобнее проводить через DNS
  • --agree-tos - Согласие с ACME server's Subscriber Agreement (ToS - Terms of service)
  • -m - Ваш Email
  • -d - Ваше доменное имя с префиксом "*."
  • -d - Сразу следом указываем каноническое имя домена, если вы им пользуетесь
  • --manual - Получить сертификат вручную (без помощи плагина для nginx)
  • --server - Для Wildcard надо указать endpoint (возможные можно посмотреть тут)

Пример:

certbot certonly --preferred-challenges=dns --agree-tos -m example@example.org -d *.example.org -d example.org --manual --server https://acme-v02.api.letsencrypt.org/directory

Во время запуска этой команды добавьте по запросу две TXT-записи к своему домену, например:

_acme-challenge.example.org. 60  IN TXT "4RMgK51t1OMNHPJVmOsIPIIkBnad5oUxk_WK6FTmo1w"
_acme-challenge.example.org. 60  IN TXT "M5QE7dXdS0RDEZ2uAno-PEfkc_6x5HftXtNJpEd87mI"

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

Посмотреть список полученных сертификатов

После ввода команды:

certbot certificates

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

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

openssl s_client -connect example.org:443 -servername example.org

Если в ответ получили:

no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Start Time: 1630349404
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)

То может помочь установка ssl в секции listen:

server {
    listen              443 ssl;
    server_name         example.org;
    ssl_certificate     fullchain.pem;
    ssl_certificate_key privkey.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ...
}

Комментарии

Если подтверждать домен через TXT запись, то большой шанс, что на новое продление сгенерится новый токен.
Так что лучше через A запись работать

Оставьте свой комментарий

Markdown