Больше не нужно искать работу мечты — присоединяйтесь к команде Клауда
На главную
61c46507-12c7-4300-a301-bd8bc30c7c19
Инструкции для серверов

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

Рассмотрим, как установить SSL-сертификат от Let's Encrypt для веб-сервера Nginx на операционных системах Ubuntu и CentOS.

Выпуск и установка Let's Encrypt

Установка Certbot

Для выпуска сертификата воспользуемся утилитой Certbot. 

Ubuntu

Установим Certbot и плагин для Nginx:

sudo apt install certbot python3-certbot-nginx

CentOS

Для установки Certbot на CentOS требуется включить репозиторий EPEL (Extra Packages for Enterprise Linux), который содержит дополнительные пакеты, не входящие в стандартные репозитории CentOS.

Репозиторий EPEL добавляется с помощью пакета epel-release, который можно установить так:

sudo dnf install epel-release

После этого, установим Certbot и плагин для Nginx:

sudo dnf install certbot python3-certbot-nginx

Теперь Certbot готов к использованию для выпуска и настройки SSL-сертификата.

Проверка конфигурации Nginx

Certbot настроит сертификат для виртуального хоста, ориентируясь на домен, указанный в директиве server_name. Убедитесь, что в конфигурации Nginx указан правильный домен вашего сайта.

Для этого откройте файл конфигурации:

Ubuntu

sudo nano /etc/nginx/sites-available/имя_сайта

CentOS

sudo vi /etc/nginx/conf.d/имя_сайта

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

После этого, проверьте конфигурацию Nginx на наличие ошибок:

sudo nginx -t

Если вы вносили изменения в конфигурацию, перезапустите веб-сервер:

sudo systemctl reload nginx

Получение SSL

Запустите Certbot с плагином Nginx, чтобы получить и настроить SSL-сертификат:

sudo certbot --nginx -d example.com -d www.example.com

Где example.com и www.example.com — это домены, которые должны быть указаны в конфигурации Nginx.

При первом запуске Certbot запросит ваш контактный email, а также предложит принять условия лицензионного соглашения.

После успешного завершения процедуры, Certbot покажет путь к сохранённым сертификатам:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for example.com and www.example.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2025-01-14.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for example.com to /etc/nginx/conf.d/example.com.conf
Successfully deployed certificate for www.example.com to /etc/nginx/conf.d/example.com.conf
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com

Автоматическое обновление SSL-сертификатов

Сертификаты Let's Encrypt действуют 90 дней, поэтому их необходимо своевременно обновлять. Это можно сделать вручную с помощью команды:

certbot renew

Однако рекомендуется настроить автоматическое обновление с помощью cron-задачи. Откройте редактор cron:

crontab -e

Добавьте следующую строку:

30 3 * * 2 /usr/bin/certbot renew >> /var/log/renew-ssl.log --post-hook "systemctl reload nginx"

Эта задача настроит автоматическое обновление сертификатов каждый вторник в 03:30 утра. Certbot будет проверять срок действия сертификатов и, если до их истечения останется менее 30 дней, выполнит автоматическое обновление. После успешного обновления Nginx будет перезагружен, чтобы начать использовать новый сертификат. Все действия Certbot будут записываться в файл renew-ssl.log.

Установка существующего сертификата

Если у вас уже приобретен SSL-сертификат, установить его можно по инструкции ниже.

Загрузка файлов сертификата на сервер

  1. Как правило, после покупки сертификата у вас будут следующие файлы: сам сертификат (.crt) и цепочка сертификатов (.ca-bundle), которая содержит промежуточный и корневой сертификат. 

Вам нужно скопировать их содержимое в единый файл ваш_домен.crt, друг под другом, без пробелов. Файл ваш_домен.crt можно создать с помощью Блокнота или любого другого текстового редактора.

У вас получится следующее:

-----BEGIN CERTIFICATE-----
#Сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Промежуточный сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Корневой сертификат#
-----END CERTIFICATE-----

Если вы покупали SSL в Timeweb Cloud, у вас будет один файл CRT, который уже содержит все необходимые данные. Просто полностью скопируйте его содержимое — это можно сделать в разделе «SSL-сертификаты».

Cc46ef08 C38e 4cab B644 28d04b7982a1

Если вы покупали SSL у другого провайдера и у вас нет файла цепочки, запросить ее можно через поддержку провайдера или сгенерировать с помощью сервиса https://whatsmychaincert.com/.

  1. Также после покупки SSL у вас будет файл приватного (секретного) ключа.

В Timeweb Cloud файл Private KEY можно найти в разделе «SSL-сертификаты». Если вы покупали SSL через другого провайдера и у вас нет этого файла, запросите его через поддержку провайдера.

Создайте новый файл с именем ваш_домен.key и скопируйте в него содержимое приватного ключа.

  1. Подключитесь к серверу по FTP / SFTP и загрузите файлы в директорию /etc/ssl.

Другой вариант — подключиться по SSH и создать нужные файлы в директории /etc/ssl, например:

sudo nano /etc/ssl/mydomain.ru.crt

В созданный файл вставьте содержимое сертификата и цепочки. Сохраните изменения (Ctrl+X, затем Y и Enter).

Создайте файл ключа:

sudo nano /etc/ssl/mydomain.ru.key

Вставьте в него содержимое файла ключа и сохраните изменения.

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

В зависимости от ваших настроек, потребуется изменить либо основной конфиг-файл Nginx (/etc/nginx/nginx.conf), либо конфиг виртуального хоста, если вы его создавали.

Для Ubuntu файл конфигурации виртуального хоста находится по пути /etc/nginx/sites-available/ваш_домен.conf. Для CentOS конфигурационный файл виртуального хоста располагается в директории /etc/nginx/conf.d/ваш_домен.conf.

Ubuntu

Откройте его:

sudo nano /etc/nginx/sites-available/ваш_домен.conf

CentOS

Откройте его:

sudo vi /etc/nginx/conf.d/ваш_домен.conf

В блок server{} добавьте следующие данные:

Вместо:

listen 80;
listen [::]:80;

Укажите:

listen 443 ssl;

Под строкой:

server_name ваш_домен www.ваш_домен;

Укажите пути к файлам сертификата и ключа: 

ssl_certificate /etc/ssl/ваш_домен.crt;
ssl_certificate_key /etc/ssl/ваш_домен.key;

Чтобы перенаправлять клиентов, обратившихся к сайту по HTTP, на безопасное подключение, добавьте новый блок server{} под существующим со следующим содержимым:

server {
    listen 80;
    listen [::]:80;

    server_name ваш_домен www.ваш_домен;
    return 302 https://$server_name$request_uri;
}

Здесь мы указываем временный 302 редирект. После того, как вы проверите работу и убедитесь, что все в порядке, замените его на 301.

В итоге у вас должно получиться что-то подобное:

server {
  listen 443 ssl;

    server_name mydomain.ru www.mydomain.ru;
    ssl_certificate /etc/ssl/mydomain.ru.crt;
    ssl_certificate_key /etc/ssl/mydomain.ru.key;
    root /var/www/mydomain.ru/html;
    index index.html index.xml;
}
server {
    listen 80;
    listen [::]:80;

    server_name mydomain.ru www.mydomain.ru;
    return 302 https://$server_name$request_uri;
}

Этих настроек достаточно для работы сертификата. Вы можете сохранить изменения и сразу перейти к шагу 4. Либо можно настроить дополнительные параметры — их рассмотрим на следующем шаге.

Дополнительные настройки (опционально)

  1. Чтобы оптимизировать работу Nginx при использовании SSL, можно задействовать кэш SSL-сессий. 
    • Укажем, что будем использовать shared-кэш, который делится между всеми рабочими процессами, и его размер — 10 Мб:
ssl_session_cache shared:SSL:10m;

Эту и следующие строки также вставьте в блок server{} — под строки с путями до сертификатов.

    • Зададим таймаут кэша в 10 минут:
ssl_session_timeout 10m;

Таймаут — это период, в течение которого параметры SSL-сессии используются повторно. По умолчанию таймаут равен 5 минутам, если вам подходит это значение, директиву ssl_session_timeout можно не указывать. А можно, напротив, значительно увеличить таймаут, чтобы повысить производительность веб-сервера — например, до одного дня (1d).

    • Зададим время работы одного соединения:
keepalive_timeout 70;
  1. Чтобы ускорить загрузку страниц сайта у его посетителей, можно включить опцию SSL stapling — это разрешит серверу прикреплять OCSP-ответы для валидации сертификата. 

Для этого вам понадобится создать файл ca.crt, который будет содержать корневой сертификат, полученный вами при покупке SSL (в файле цепочки он идет последним).

Созданный файл нужно разместить на сервере в директории с сертификатами /etc/ssl.

Включаем SSL stapling, добавляя директиву:

ssl_stapling on;

Указываем путь к корневому сертификату:

ssl_trusted_certificate /etc/ssl/ca.crt;

Указываем DNS:

resolver 8.8.8.8;

Сохраните изменения.

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

server {
  listen 443 ssl;

    server_name mydomain.ru www.mydomain.ru;
    ssl_certificate /etc/ssl/mydomain.ru.crt;
    ssl_certificate_key /etc/ssl/mydomain.ru.key;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    keepalive_timeout 70;
    ssl_stapling on;
    ssl_trusted_certificate /etc/ssl/ca.crt;
    resolver 8.8.8.8;

    root /var/www/mydomain.ru/html;
    index index.html index.xml;
}

server {
    listen 80;
    listen [::]:80;

  server_name mydomain.ru www.mydomain.ru;
    return 302 https://$server_name$request_uri;
}

Применение настроек

Проверьте конфигурацию Nginx:

sudo nginx -t

Перезапустите Nginx, чтобы изменения вступили в силу:

sudo systemctl restart nginx

Проверьте работу сайта — теперь он должен быть доступен по HTTPS.

Была ли статья полезна?
Ваша оценка очень важна
Пока нет комментариев