Рассмотрим, как установить SSL-сертификат от Let's Encrypt для веб-сервера Nginx на операционных системах Ubuntu и CentOS.
Для выпуска сертификата воспользуемся утилитой 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-сертификата.
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
Запустите 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
Сертификаты 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-сертификат, установить его можно по инструкции ниже.
.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
), либо конфиг виртуального хоста, если вы его создавали.
Для 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. Либо можно настроить дополнительные параметры — их рассмотрим на следующем шаге.
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;
}
Проверьте конфигурацию Nginx:
sudo nginx -t
Перезапустите Nginx, чтобы изменения вступили в силу:
sudo systemctl restart nginx
Проверьте работу сайта — теперь он должен быть доступен по HTTPS.