Получаем бесплатный 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
где:
- 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
Во время запуска этой команды добавьте по запросу две 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 запись работать
Оставьте свой комментарий