Настройка SSL сертификата Let’s Encrypt для Nginx

В этой статье мы рассмотрим, как настроить бесплатный TLS/SSL сертфикат Let’s Encrypt для сайта на веб-сервере Nginx на Linux CentOS. Покажем, как выпустить сертификат для одного домена (или wildecard SSL-сертификат для всех поддоменов), настроить автопродление сертфикатов.

Установка certbot — клиента Let’s Encrypt в Linux

Выпускать сертификат Let’s Encrypt мы будем с помощью certbot. Для установка бота, нужно воспользоваться утилитой snapd , если у вас ее нет, установите ее:

# yum install snapd -y

установка snapd в linux

После установки snapd, его нужно добавить, как сервис и создать симлинк для удобства запуска:

# systemctl enable --now snapd.socket
# ln -s /var/lib/snapd/snap /snap

Теперь можно установить certbot:

# sudo snap install --classic certbot

установка certbot в linux через snap Все также для удобства запуска, создадим симлинк:

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

Выпуск SSL сертификата для Nginx

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

# certbot certonly --nginx

Утилита проверит конфигурацию nginx и выдаст все сайты на которые можно установить сертификат (утилита получает список сайтов из конфигурации nginx). В процессе бот будет запрашивать у вас данные, email, домены и тд.

генерация сертификата let's encrypt с помощью certbot для nginx в linux

В моем случае домен один и я выбрал его. Если у вас нет проблем с DNS-записями домена и веб-сервером, то SSL сертификат должен выпуститься без ошибок.

Установка SSL сертификата Let’s Encrypt на веб-сайт Nginx

Чтобы SSL сертификат Let’s Encrypt заработал на вашем сайте, нужно использовать следующий конфигурационный файл nginx для вашего домена:

server {_x000D_ listen 443 ssl http2;_x000D_ server_name lets.build-centos.ru;_x000D_ root /var/www/lets.build-centos.ru;_x000D_ index index.php index.html index.htm;_x000D_ access_log /var/www/build-centos.info/log/ssl-access.log main;_x000D_ error_log /var/www/build-centos.info/log/ssl-error.log;_x000D_ keepalive_timeout 60;_x000D_ ssl_certificate /etc/letsencrypt/live/build-centos.info/fullchain.pem;_x000D_ ssl_certificate_key /etc/letsencrypt/live/build-centos.info/privkey.pem;_x000D_ ssl_protocols TLSv1 TLSv1.1 TLSv1.2;_x000D_ ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';_x000D_ add_header Strict-Transport-Security 'max-age=604800';_x000D_ location / {_x000D_ try_files $uri $uri/ /index.php?$args;_x000D_ }_x000D_ location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {_x000D_ access_log off;_x000D_ expires max;_x000D_ }_x000D_ location ~ .php$ {_x000D_ try_files $uri =404;_x000D_ fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;_x000D_ fastcgi_index index.php;_x000D_ fastcgi_param DOCUMENT_ROOT /var/www/lets.build-centos.ru;_x000D_ fastcgi_param SCRIPT_FILENAME /var/www/lets.build-centos.ru/$fastcgi_script_name;_x000D_ fastcgi_param PATH_TRANSLATED /var/www/lets.build-centos.ru/$fastcgi_script_name;_x000D_ include fastcgi_params;_x000D_ fastcgi_param QUERY_STRING $query_string;_x000D_ fastcgi_param REQUEST_METHOD $request_method;_x000D_ fastcgi_param CONTENT_TYPE $content_type;_x000D_ fastcgi_param CONTENT_LENGTH $content_length;_x000D_ fastcgi_param HTTPS on;_x000D_ fastcgi_intercept_errors on;_x000D_ fastcgi_ignore_client_abort off;_x000D_ fastcgi_connect_timeout 60;_x000D_ fastcgi_send_timeout 180;_x000D_ fastcgi_read_timeout 180;_x000D_ fastcgi_buffer_size 128k;_x000D_ fastcgi_buffers 4 256k;_x000D_ fastcgi_busy_buffers_size 256k;_x000D_ fastcgi_temp_file_write_size 256k;_x000D_ }_x000D_ location = /favicon.ico {_x000D_ log_not_found off;_x000D_ access_log off;_x000D_ }_x000D_ location = /robots.txt {_x000D_ allow all;_x000D_ log_not_found off;_x000D_ access_log off;_x000D_ }_x000D_ location ~ /.ht {_x000D_ deny all;_x000D_ }_x000D_ }

Сохраните конфигурационный файл. Выполняем проверку валидности настроек в конфигурационном файле nginx:

[root@server letsencrypt]# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok_x000D_nginx: configuration file /etc/nginx/nginx.conf test is successful

Перезапустите веб-сервер nginx:

# service nginx restart

Теперь, если открыть в браузере сайт по протоколу https, высвечиваться значок защищенного соединения.

Если щёлкнуть по значку сертификата, можно получить полную информацию о нем:

tls сертфикат lets encrypt для сайта на nginx

Для нагруженных PHP сайтов на Nginx можно использоваться связку с php-fpm .

Бесплатные Wildcard SSL сертификаты Let’s Encrypt для поддоменов

Чтобы выпустить wildcard сертификат Let’s Encrypt для всех поддоменов, используется другая команда. Кроме того, в DNS настройках вашего домена нужно создать специальную txt-запись. Чтобы выпустить wildcard сертификат для поддоменов, в директории /opt/letsencrypt/ запустите команду:

# certbot run -a manual -i nginx -d *.lets.build-centos.ru

После запуска команды, вам нужно будет пройти всю процедуру валидации домена, в том числе нужно будет создать специальную TXT запись в DNS.

Не нажимайте “Enter” пока не убедитесь, что запись доступна на глобальных DNS. В панели регистратора домена создайте DNS запись типа TXT с именем _acme-challenge и значением, скопированным из консоли certbot.

letsencrypt-auto certonly wildecard сертфикат для поддоменов

txt запись _acme-challenge для выпуска сертификата для всех поддоменов

Дождитесь обновления информации в DNS, нажмите Enter и wildcard SSL сертификат будет успешно выпущен:

ssl сертификат lets encrypt _acme-challenge

Директория хранения сертификатов и ключей в этом случае отличается от той, в который помещен сертификат для основного домена.

Проверим, работает ли сертификат на поддомене test.build-centos.ru:

wildcard сертфикат lets' encrypt

Как видно из скриншота, сертификат выпущен корректно и действителен для всех поддоменов.

Продление сертификатов Let’s Encrypt

Сертификаты Let’s Encrypt выдаются на 90 дней, рекомендуется продлевать эти сертификаты каждые 60 дней.

Чтобы перевыпустить устаревший SSL сертификат Let’s Encrypt, используется команда:

# /certbot renew --dry-run

Если запустить команду сразу после того, как вы выпустили сертификаты, появится уведомление, что сертификат не требует перевыпуска:

Cert not yet due for renewal

обновление сертфиката let's ecncrypt

Чтобы продление SSL сертификата Let’s Encrypt выполнялось автоматически, нужно добавить задание в cron :

00 00 * * 6 /certbot renew --dry-run >> /var/log/le-renew.log
15 00 * * 6 /usr/bin/systemctl reload nginx

Данный cron job будет пытаться каждую субботу продлить сертификата и выполнять мягкую перезагрузку веб-сервера nginx. Все действия по перевыпуску SSL сертификатов будут фиксироваться в лог файле /var/log/le-renew.log .

Все логи Let’s Encrypt хранятся в директории /var/log/letsencrypt .

Таким образом, мы установили бесплатный SSL сертификат Let’s Encrypt на свой web-сайт, работающий на Nginx.

Бесплатные сертификаты Let’s Encrypt также можно использовать и для сайтов на IIS .
EnglishRussianUkrainian