Настройка 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 {
  listen 443 ssl http2;
  server_name lets.build-centos.ru;
  root /var/www/lets.build-centos.ru;
  index index.php index.html index.htm;
  access_log /var/www/build-centos.info/log/ssl-access.log main;
  error_log /var/www/build-centos.info/log/ssl-error.log;
  keepalive_timeout 60;
  ssl_certificate /etc/letsencrypt/live/build-centos.info/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/build-centos.info/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  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';
  add_header Strict-Transport-Security 'max-age=604800';
  location / {
    try_files $uri $uri/ /index.php?$args;%MINIFYHTMLb64776b8cdf14f11dec0feb386c6709d7%
%MINIFYHTMLb64776b8cdf14f11dec0feb386c6709d8%}
  location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
    access_log off;
    expires max;
  }
  location ~ \.php$ {
  try_files $uri =404;
  fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
  fastcgi_index index.php;
  fastcgi_param DOCUMENT_ROOT /var/www/lets.build-centos.ru;
  fastcgi_param SCRIPT_FILENAME /var/www/lets.build-centos.ru/$fastcgi_script_name;
  fastcgi_param PATH_TRANSLATED /var/www/lets.build-centos.ru/$fastcgi_script_name;
  include fastcgi_params;
  fastcgi_param QUERY_STRING $query_string;
  fastcgi_param REQUEST_METHOD $request_method;
  fastcgi_param CONTENT_TYPE $content_type;
  fastcgi_param CONTENT_LENGTH $content_length;
  fastcgi_param HTTPS on;
  fastcgi_intercept_errors on;
  fastcgi_ignore_client_abort off;
  fastcgi_connect_timeout 60;
  fastcgi_send_timeout 180;
  fastcgi_read_timeout 180;
  fastcgi_buffer_size 128k;
  fastcgi_buffers 4 256k;
  fastcgi_busy_buffers_size 256k;
  fastcgi_temp_file_write_size 256k;
  }
    location = /favicon.ico {
    log_not_found off;
    access_log off;
  }
  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }
  location ~ /\.ht {
    deny all;
  }
 }

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

[root@server letsencrypt]# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
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.

Предыдущая статья Следующая статья


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

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)