Установка 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. Загрузка файлов сертификата на сервер
- Обычно после покупки сертификата у вас есть следующие файлы: сам сертификат (.crt) и цепочка сертификатов (.ca-bundle), которая включает в себя промежуточные и корневой сертификаты.
Скопируйте содержимое этих файлов в один файл ваш_домен.crt, разместив их друг под другом, без пробелов. Для этого вы можете воспользоваться текстовым редактором, например, Блокнотом.
В результате должно получиться что-то вроде:
-----BEGIN CERTIFICATE-----
#Сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Промежуточный сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Корневой сертификат#
-----END CERTIFICATE-----
Цепочку файлов можно получить, обратившись за помощью к вашему хостинг-провайдеру, либо сгенерировать с использованием сервиса https://whatsmychaincert.com/.
- Также после приобретения SSL у вас будет файл с закрытым ключом.
Если вы используете Timeweb Cloud, файл Private KEY доступен в разделе "SSL-сертификаты". Если ваш SSL был приобретен у другого провайдера и у вас нет этого файла, запросите его у службы поддержки вашего провайдера.
Создайте новый файл с именем ваш_домен.key и вставьте в него содержимое закрытого ключа.
- Подключитесь к вашему серверу с использованием 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. Дополнительные настройки (опционально)
- Для повышения производительности 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;
- Для улучшения скорости загрузки страниц сайта вашими посетителями, вы можете активировать опцию 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.