Помощь

Установка SSL в Nginx

В данной статье мы рассмотрим процесс установки SSL-сертификата для Nginx на операционной системе Ubuntu. Предполагается, что Nginx уже установлен и настроен, как описано в соответствующей статье.

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

Шаг 1. Установка Certbot

Для получения SSL-сертификата мы воспользуемся Certbot. Давайте установим его на сервер:

sudo apt install certbot python3-certbot-nginx

Шаг 2. Настройка конфигурации Nginx

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

Если вы следовали нашей предыдущей инструкции по настройке виртуальных хостов Nginx, у вас уже должен быть создан файл виртуального хоста по пути /etc/nginx/sites-available/имя_сайта (например, /etc/nginx/sites-available/testsite.dev).

Для проверки откроем файл в текстовом редакторе:

sudo nano /etc/nginx/sites-available/testsite.dev

Найдите в нем директиву server_name и убедитесь, что в ней указан ваш домен:

...
server_name testsite.dev www.testsite.dev;
...

Если необходимо, внесите изменения и сохраните файл.

Затем проверьте конфигурацию Nginx на наличие ошибок:

sudo nginx -t

Если ошибок нет, перезапустите веб-сервер:

sudo systemctl reload nginx

Шаг 3. Настройка брандмауэра

Далее необходимо разрешить трафик HTTPS через брандмауэр.

Проверьте текущие правила брандмауэра с помощью следующей команды:

sudo ufw status

Если разрешен только HTTP-трафик, вывод будет примерно таким:

В данной статье мы рассмотрим процесс установки SSL-сертификата для Nginx на операционной системе Ubuntu. Предполагается, что Nginx уже установлен и настроен, как описано в соответствующей статье.

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

Шаг 1. Установка Certbot

Для получения SSL-сертификата мы воспользуемся Certbot. Давайте установим его на сервер:

sudo apt install certbot python3-certbot-nginx

Шаг 2. Настройка конфигурации Nginx

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

Если вы следовали нашей предыдущей инструкции по настройке виртуальных хостов Nginx, у вас уже должен быть создан файл виртуального хоста по пути /etc/nginx/sites-available/имя_сайта (например, /etc/nginx/sites-available/testsite.dev).

Для проверки откроем файл в текстовом редакторе:

sudo nano /etc/nginx/sites-available/testsite.dev

Найдите в нем директиву server_name и убедитесь, что в ней указан ваш домен:

...
server_name testsite.dev www.testsite.dev;
...

Если необходимо, внесите изменения и сохраните файл.

Затем проверьте конфигурацию Nginx на наличие ошибок:

sudo nginx -t

Если ошибок нет, перезапустите веб-сервер:

sudo systemctl reload nginx

Шаг 3. Настройка брандмауэра

Далее необходимо разрешить трафик HTTPS через брандмауэр.

Проверьте текущие правила брандмауэра с помощью следующей команды:

sudo ufw status

Если разрешен только HTTP-трафик, вывод будет примерно таким:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Внесем изменения, а именно разрешим HTTPS-трафик. Для этого выполним:

sudo ufw allow 'Nginx Full'

Профиль Nginx Full разрешает оба типа трафика: и HTTPS, на порту 443, и HTTP, на порту 80. 

Разрешать отдельно HTTP-трафик нам больше не требуется, поэтому удалим ненужную директиву:

sudo ufw delete allow 'Nginx HTTP'

Снова проверим настройки брандмауэра: 

sudo ufw status

Если все в порядке, вы увидите, что весь трафик (Nginx Full) разрешен:

Status: active

To                   Action      From
--                   ------      ----
OpenSSH              ALLOW       Anywhere
Nginx Full           ALLOW       Anywhere
OpenSSH (v6)         ALLOW       Anywhere (v6)
Nginx Full (v6)      ALLOW       Anywhere (v6)

Шаг 4. Получение SSL

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

sudo certbot --nginx -d testsite.dev -d www.testsite.dev

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

Затем выберите, как вы хотите настроить HTTPS:

Пожалуйста, выберите, хотите ли вы перенаправить HTTP-трафик на HTTPS, удалив доступ к HTTP.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Не перенаправлять - Не вносить дополнительные изменения в конфигурацию веб-сервера.
2: Перенаправить - Сделать так, чтобы все запросы перенаправлялись на безопасный HTTPS-доступ. Выберите этот вариант для
новых сайтов или если вы уверены, что ваш сайт работает по HTTPS. Вы можете отменить это
изменение, отредактировав конфигурацию вашего веб-сервера.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Выберите подходящий номер [1-2], затем [введите] (нажмите 'c' для отмены):

Когда процесс завершится, система сообщит вам, что он успешно выполнен, и укажет расположение сертификатов:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/testsite.dev/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/testsite.dev/privkey.pem
   Your cert will expire on 2022-12-27. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"

 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Теперь вы можете обращаться к вашему домену, используя протокол HTTPS.

Шаг 5. Автоматическое обновление SSL

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

certbot renew

Тем не менее, можно автоматизировать этот процесс, создав соответствующую cron-задачу:

crontab -e

Добавьте следующую строку, чтобы установить автоматическое обновление:

30 3 * * 2 /usr/bin/certbot renew >> /var/log/renew-ssl.log

Таким образом, каждый вторник в 03:30 ночи Certbot будет автоматически проверять и обновлять сертификаты, которым осталось менее 30 дней до истечения. Результаты будут записываться в файл renew-ssl.log.

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

Если у вас уже есть SSL-сертификат, вы можете установить его, следуя этим инструкциям.

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

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

Скопируйте содержимое этих файлов в один файл ваш_домен.crt, разместив их друг под другом, без пробелов. Для этого вы можете воспользоваться текстовым редактором, например, Блокнотом.

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

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

Цепочку файлов можно получить, обратившись за помощью к вашему хостинг-провайдеру, либо сгенерировать с использованием сервиса 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

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

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

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

Если вы следовали нашей инструкции по установке Nginx, то у вас должен быть создан файл конфигурации виртуального хоста в каталоге /etc/nginx/sites-available/ваш_домен.conf.

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

sudo nano /etc/nginx/sites-available/ваш_домен.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;
}

Настройки, представленные выше, уже достаточны для обеспечения работоспособности SSL-сертификата. Вы можете сохранить ваши изменения и переходить к шагу 4. Однако, если вы желаете дополнительно оптимизировать работу Nginx при использовании SSL, вы можете настроить несколько дополнительных параметров, которые мы рассмотрим на следующем шаге.

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

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

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

    • Установим таймаут кэша в 10 минут:
ssl_session_timeout 10m;

Таймаут определяет период времени, в течение которого параметры SSL-сессии могут быть повторно использованы. По умолчанию таймаут составляет 5 минут. Если это значение вас устраивает, то указывать директиву ssl_session_timeout не обязательно. Однако, если вы желаете увеличить таймаут, чтобы улучшить производительность веб-сервера, вы можете указать его в более длительных интервалах, например, 1 день (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;
}

Шаг 4. Настройка брандмауэра

Проверьте текущие настройки брандмауэра:

sudo ufw status

Если в выводе отсутствуют профили Nginx HTTPS или Nginx Full, это означает, что в настоящее время разрешен только HTTP-трафик.

Для исправления ситуации добавьте профиль Nginx Full и удалите Nginx HTTP. Профиль Nginx Full разрешает оба типа трафика: и HTTPS на порту 443, и HTTP на порту 80.

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

Проверьте обновленные настройки брандмауэра:

sudo ufw status

Вывод должен выглядеть следующим образом:

Status: active

To                Action      From
--                -----       ----
OpenSSH           ALLOW       Anywhere
Nginx Full        ALLOW       Anywhere
OpenSSH (v6)      ALLOW       Anywhere (v6)
Nginx Full (v6)   ALLOW       Anywhere (v6)

Шаг 5. Применение настроек

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

sudo nginx -t

Для применения внесенных изменений, перезапустите Nginx:

sudo /etc/init.d/nginx restart

После этого убедитесь, что ваш сайт работает корректно по протоколу HTTPS.

Остались вопросы - пишите