В статье рассмотрим, как установить SSL-сертификат для Nginx в Ubuntu. Установку и настройку Nginx на Ubuntu мы описывали в отдельной статье.
Чтобы получить сертификат, воспользуемся Certbot. Установим его на сервер:
sudo apt install certbot python3-certbot-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
Далее нам нужно разрешить трафик 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)
Запустим 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.
Сертификаты 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-сертификат, установить его можно по инструкции ниже.
.crt
) и цепочка сертификатов (.ca-bundle
), которая содержит промежуточный и корневой сертификат. Вам нужно скопировать их содержимое в единый файл ваш_домен.crt
, друг под другом, без пробелов. Файл ваш_домен.crt
можно создать с помощью Блокнота или любого другого текстового редактора.
У вас получится следующее:
-----BEGIN CERTIFICATE-----
#Сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Промежуточный сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Корневой сертификат#
-----END CERTIFICATE-----
Если вы покупали SSL в Timeweb Cloud, у вас будет один файл CRT, который уже содержит все необходимые данные. Просто полностью скопируйте его содержимое — это можно сделать в разделе «SSL-сертификаты».
Если вы покупали SSL у другого провайдера и у вас нет файла цепочки, запросить ее можно через поддержку провайдера или сгенерировать с помощью сервиса https://whatsmychaincert.com/.
В Timeweb Cloud файл Private KEY
можно найти в разделе «SSL-сертификаты». Если вы покупали SSL через другого провайдера и у вас нет этого файла, запросите его через поддержку провайдера.
Создайте новый файл с именем ваш_домен.key
и скопируйте в него содержимое приватного ключа.
/etc/ssl
.Другой вариант — подключиться по SSH и создать нужные файлы в директории /etc/ssl
, например:
sudo nano /etc/ssl/mydomain.ru.crt
В созданный файл вставьте содержимое сертификата и цепочки. Сохраните изменения (Ctrl+X, затем Y и Enter).
Создайте файл ключа:
sudo nano /etc/ssl/mydomain.ru.key
Вставьте в него содержимое файла ключа и сохраните изменения.
В зависимости от ваших настроек, потребуется изменить либо основной конфиг-файл 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. Либо можно настроить дополнительные параметры — их рассмотрим на следующем шаге.
ssl_session_cache shared:SSL:10m;
Эту и следующие строки также вставьте в блок server{}
— под строки с путями до сертификатов.
ssl_session_timeout 10m;
Таймаут — это период, в течение которого параметры SSL-сессии используются повторно. По умолчанию таймаут равен 5 минутам, если вам подходит это значение, директиву ssl_session_timeout
можно не указывать. А можно, напротив, значительно увеличить таймаут, чтобы повысить производительность веб-сервера — например, до одного дня (1d
).
keepalive_timeout 70;
Для этого вам понадобится создать файл 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;
}
Проверьте текущие параметры:
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)
Проверьте конфигурацию Nginx:
sudo nginx -t
Перезапустите Nginx, чтобы изменения вступили в силу:
sudo /etc/init.d/nginx restart
Проверьте работу сайта — теперь он должен быть доступен по HTTPS.