TLS-сертификаты используются для организации защищённого доступа к сайтам и веб-приложениям по протоколу HTTPS. При использовании HTTPS данные между браузером пользователя и сервером передаются в зашифрованном виде, что позволяет защитить от перехвата пароли, данные форм и другую конфиденциальную информацию.
Обычно для получения TLS-сертификата используется доменное имя, направленное на IP-адрес сервера, на котором работает сайт. Однако в некоторых случаях сайт или веб-приложение может быть доступно только по IP-адресу и отдельное доменное имя для него не используется.
Let’s Encrypt поддерживает выпуск TLS-сертификатов именно для публичных IP-адресов. Такие сертификаты являются краткосрочными и имеют срок действия шесть дней. При их использовании необходимо дополнительно уделить внимание настройке автоматического продления, чтобы обеспечить непрерывную работу HTTPS-соединения.
В статье разберём, как получить TLS-сертификат Let’s Encrypt для сайта, доступного только по IP-адресу, и как настроить HTTPS для веб-серверов Nginx и Apache на примере VPS, работающего под управлением Ubuntu или Debian.
Настройка брандмауэра
Для успешной установки TLS-сертификата сервер должен принимать подключения по TCP-порту 80. Данный порт используется для подтверждения контроля над IP-адресом при помощи механизма HTTP-01 challenge. Если на сервере настроена защита при помощи брандмауэра, то для открытия порта выполните команду:
$ sudo ufw allow http
Чтобы сайт стал доступен после настройки HTTPS, необходимо также обеспечить доступ к TCP-порту 443. Для чего используйте команду:
$ sudo ufw allow https
Установка Certbot
Для получения TLS-сертификата Let’s Encrypt удобно использовать утилиту Certbot. Чтобы данная утилита могла работать с веб-сервером, доступ к которому осуществляется только по IP-адресу, нужна современная версия утилиты. Установка Certbot актуальной версии описана в соответствующей статье нашего справочника.
После установки проверьте версию Certbot:
$ certbot --version
Для получения сертификата с использованием требуемых опций рекомендуется использовать Certbot версии 5.4 или новее.
Установка TLS-сертификата Let’s Encrypt
В отличие от обычных сертификатов для доменных имён, сертификаты для узлов, доступных по IP-адресу, выпускаются с использованием профиля shortlived. Для получения сертификата выполните команду, заменив X.X.X.X на IP-адрес вашего сервера:
$ sudo certbot certonly \
--preferred-profile shortlived \
--ip-address X.X.X.X \
--webroot \
--webroot-path /var/www/html/
В данном случае:
certonly– указывает Certbot, что нужно получить сертификат без автоматического изменения конфигурации веб-сервера;--preferred-profile shortlived– запрашивает краткосрочный профиль, необходимый для сертификатов с привязкой к IP-адресу;--ip-address X.X.X.X– указывает IP-адрес, для которого необходимо получить сертификат;--webroot– включает метод подтверждения через каталог сайта;--webroot-path /var/www/html/– указывает каталог, из которого веб-сервер публикует файлы сайта.
Если Certbot установлен с использованием Snap, то при запуске команды через sudo может потребоваться указать полный путь к исполняемому файлу. Это связано с тем, что sudo использует переменную окружения PATH, отличающуюся от переменной PATH текущего пользователя. В таком случае команда для получения сертификата должны выглядеть так:
$ sudo /snap/bin/certbot certonly \
--preferred-profile shortlived \
--ip-address X.X.X.X \
--webroot \
--webroot-path /var/www/html/
При выполнении команды Certbot попросит указать адрес электронной почты для регистрации аккаунта в инфраструктуре Let’s Encrypt. Затем утилита предложит согласиться с условиями обслуживания, что сделать необходимо, поскольку для получения сертификатов вы используете сервис Let’s Encrypt. Также Certbot попросит вашего согласия на передачу вашего E-mail в адрес EFF (Electronic Frontier Foundation) – партнёрской организации Let’s Encrypt. В данном случае согласие не является обязательным условием для получения сертификата. EFF может использовать указанный адрес для отправки новостей, информации о проектах и других материалов. От передачи адреса в EFF можно отказаться, ответив n.
После чего Certbot зарегистрирует аккаунт для вашего IP-адреса, выполнит проверку владения IP-адресом при помощи создания временного файла и обращения к нему по HTTP, и после успешной проверки Let’s Encrypt выпустит сертификат для указанного IP-адреса и сохранит файлы сертификата на вашем сервере. Путь, по которому сохранены файлы сертификата, Certbot выведет на экран.

Поскольку в команде используется параметр certonly, Certbot только получит и сохранит сертификат, но не произведёт настройку Nginx или Apache. После получения сертификата необходимо самостоятельно указать пути к fullchain.pem и privkey.pem в конфигурации веб-сервера.
Настройка HTTPS в Nginx
Настройка доступа по HTTPS для сайта, работающего на Nginx, заключается во внесении изменений в файл конфигурации конкретного сайта. Чтобы это сделать, откройте для редактирования конфигурационный файл, например, дефолтной страницы Nginx:
$ sudo nano /etc/nginx/sites-available/default
В файле конфигурации приведите к следующему виду блок server, соответствующий настройкам подключения по HTTP:
server {
listen 80;
server_name X.X.X.X;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location ^~ /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
return 301 https://$host$request_uri;
}
}
Здесь:
listen 80– включает приём HTTP-подключений через TCP-порт 80;server_name– содержит IP-адрес сервера (укажите его вместоX.X.X.X);location ^~ /.well-known/acme-challenge/ {root /var/www/html;}– предназначен для файлов проверки, которые Certbot временно создаёт при получении или продлении TLS-сертификата;location / {return 301 https://$host$request_uri;}– обрабатывает все остальные HTTP-запросы.
Для настройки HTTPS-подключения в конец файла добавьте блок server со следующим содержимым:
server {
listen 443 ssl;
server_name X.X.X.X;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
ssl_certificate /etc/letsencrypt/live/X.X.X.X/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/X.X.X.X/privkey.pem;
location / {
try_files $uri $uri/ =404;
}
}
В данном случае:
listen 443 ssl– включает приём HTTPS-подключений через TCP-порт 443;server_name– содержит IP-адрес сервера (укажите его вместоX.X.X.X);ssl_certificate– указывает путь к TLS-сертификату из вывода утилиты Certbot;ssl_certificate_key– указывает путь к закрытому ключу из вывода утилиты Certbot.
По завершении редактирования закройте файл с сохранением изменений и проверьте конфигурацию Nginx:
$ sudo nginx -t

Если в выводе команды ошибок нет, примените новую конфигурацию:
$ sudo systemctl reload nginx
После чего проверьте доступность сайта по HTTPS. Для этого откройте браузер и перейдите по ссылке вида https://X.X.X.X, где вместо X.X.X.X укажите IP-адрес вашего сервера.

Настройка HTTPS в Apache
Если сайт работает на Apache, то после установки TLS-сертификата необходимо внести изменения в HTTPS-конфигурацию сайта. Например, откройте для редактирования конфигурационный файл дефолтной страницы Apache:
$ sudo nano /etc/apache2/sites-available/default-ssl.conf
Основное содержимое данного конфигурационного файла должно содержать следующие строки:
<VirtualHost *:443>
ServerName X.X.X.X
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/X.X.X.X/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/X.X.X.X/privkey.pem
</VirtualHost>
Здесь:
ServerName– содержит IP-адрес сервера (укажите его вместоX.X.X.X);DocumentRoot– содержит путь к файлам сайта;SSLEngine on– включает приём HTTPS-подключений через TCP-порт 443;SSLCertificateFile– содержит имя файла TLS-сертификата с указанием полного пути до него из вывода утилиты Certbot;SSLCertificateKeyFile– содержит имя файла закрытого ключа с указанием полного пути до него из вывода утилиты Certbot.
После сохранения файла следующей командой в Apache включите модуль SSL, который обеспечивает поддержку HTTPS-соединений:
$ sudo a2enmod ssl
После чего включите конфигурацию HTTPS-сайта:
$ sudo a2ensite default-ssl
Затем проверьте конфигурацию Apache:
$ sudo apachectl configtest

Если при проверке конфигурации команда выводит сообщение вида AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using X.X.X.X. Set the 'ServerName' directive globally to suppress this message, то имейте ввиду, что данный вывод не является ошибкой. Он означает, что Apache не удалось определить полное доменное имя сервера (FQDN). Поскольку в данном случае веб-страница не имеет доменного имени и доступ к ней осуществляется по IP-адресу, устранить это предупреждение можно, добавив в конец файла /etc/apache2/apache2.conf строку:
ServerName X.X.X.X
в которой вместо X.X.X.X укажите IP-адрес сервера.
Для применения всех изменений перезапустите конфигурацию веб-сервера:
$ sudo systemctl reload apache2
В качестве проверки откройте браузер и перейдите на https://X.X.X.X, где замените X.X.X.X на IP-адрес сервера.

Настройка автоматического продления сертификата
TLS-сертификаты Let’s Encrypt, выпущенные для IP-адресов, являются краткосрочными и действуют всего шесть дней. Поэтому особенно важно убедиться, что Certbot автоматически выполняет их продление.
Для проверки наличия системного таймера выполните команду:
$ systemctl list-timers | grep certbot
В выводе команды должна присутствовать строка, содержащая таймер Certbot.

При этом если Certbot установлен при помощи pip, системный таймер Certbot может отсутствовать, и данная команда не будет иметь вывода. Это связано с тем, что pip устанавливает Python-пакет Certbot и его зависимости, но не создаёт системные службы и задания для автоматического запуска программ. В этом случае автоматическое продление сертификатов необходимо настроить отдельно, например, с использованием Cron. Проверить наличие уже настроенных заданий в Cron можно командой:
$ sudo crontab -l
В данном случае вывод команды говорит об отсутствии заданий, поскольку все строки в таблице заданий закомментированы.

Если же вывод команды выглядит как sudo: crontab: command not found, то это означает, что в системе не установлен пакет с утилитой crontab. Чтобы его установить, выполните:
$ sudo apt install cron
На следующем шаге проверьте фактический путь к Certbot:
$ which certbot

После чего откройте таблицу заданий:
$ sudo crontab -e
В открывшемся редакторе добавьте, например, следующую строку:
0 */12 * * * /usr/bin/certbot renew --quiet
В этом примере Cron будет запускать проверку сертификатов каждые 12 часов, а Certbot самостоятельно определять, требуется ли продление сертификата. Обратите внимание на путь к исполняемому файлу Certbot. В данном случае необходимо использовать путь, указанный в выводе команды which certbot. А если Certbot был установлен при помощи Snap, данная строка будет выглядеть как:
0 */12 * * * /snap/bin/certbot renew --quiet
Проверка автоматического продления сертификата
При настройке продления сертификата как через системный таймер, так и при помощи Cron, рекомендуется выполнить тестовое продление:
$ sudo certbot renew --dry-run
Для Certbot, установленного с использованием Snap, данная команда будет выглядеть как:
$ sudo /snap/bin/certbot renew --dry-run
Во время выполнения команды Certbot проверяет все сертификаты, срок действия которых подходит к завершению в соответствии с правилами тестового продления. Для сертификатов, которые ещё не требуют продления, Certbot может вывести сообщение о том, что в их обновлении пока необходимости нет. При успешном завершении команды Certbot должен сообщить, что процесс проверки продления завершён без ошибок.

После продления сертификата веб-сервер должен перечитать обновлённые файлы сертификата. Для этого можно настроить команду, которая будет выполняться после успешного продления.
Например, для Nginx данная команда выглядит следующим образом:
$ sudo certbot reconfigure --deploy-hook "systemctl reload nginx"
Здесь Certbot сохранит команду systemctl reload nginx в качестве deploy-hook. В дальнейшем она будет выполняться только после успешного получения или продления сертификата.
Для Apache настройка команды, которая будет выполняться после успешного продления, выглядит как:
$ sudo certbot reconfigure --deploy-hook "systemctl reload apache2"
И для Nginx, и для Apache при выполнении этой команды Certbot должен обнаружить сертификаты, конфигурацию которых можно изменить, после чего предложит выбрать требуемый.
Затем утилита предложит выполнить тестовое продление с новой конфигурацией и одновременно предложит проверить работу настроенного deploy-hook.
Если ввести R, то Certbot во время тестового продления выполнит настроенный deploy-hook, то есть произведёт дополнительную проверку команды перезапуска веб-сервера. Если отказаться, нажав N, то утилита выполнит тестовое продление, но не будет запускать deploy-hook. Сам deploy-hook при этом всё равно будет сохранён в конфигурации и во время реального продления сертификата будет выполнен. Таким образом, успешное продление будет включать в себя обновление файлов сертификата с последующим выполнением указанной команды, в результате чего веб-сервер загрузит новую версию TLS-сертификата.
