Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

На главную

61c46507-12c7-4300-a301-bd8bc30c7c19 Инструкции для серверов

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

В статье рассмотрим, как установить SSL-сертификат для Nginx в Ubuntu. Установку и настройку Nginx на Ubuntu мы описывали в отдельной статье.

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

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

Чтобы получить сертификат, воспользуемся 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. 

Проверим, какие параметры ufw установлены сейчас:

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: 

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

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

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

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

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

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

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

  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

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

Шаг 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;
}

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

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

  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;
}

Шаг 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.

 

Была ли статья полезна?

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону