Трендовые github проекты в нашем телеграм канале. Подпишись → Защищённый веб-сервис на публичном IP-адресе
Публичный IPv4 часто используют для временного стенда, внутреннего API, устройства в сети или небольшого сервиса на VPS. Раньше HTTPS для такого узла обычно требовал доменного имени либо установки самоподписанного сертификата на каждом клиенте. Профиль shortlived в Let’s Encrypt позволяет выпустить доверенный сертификат для IP-адреса и сохранить привычную модель проверки в браузерах и клиентах.
У такого сертификата короткий срок действия — шесть дней. Поэтому конфигурацию следует строить вокруг автоматического продления и контролируемого перезапуска веб-сервера. Ниже — последовательность для Ubuntu и Lighttpd, которую удобно адаптировать под собственный сервис.
Когда сертификат на IP полезен
Сертификат подтверждает, что клиент подключился к нужному серверу, и участвует в TLS-рукопожатии. После согласования параметров стороны используют симметричный ключ сессии для шифрования HTTP-трафика. Доверенный центр сертификации подписывает сертификат, а клиент сверяет цепочку с корневыми центрами из своего хранилища.
Самоподписанный сертификат подходит для закрытой сети, локальной разработки и личной админки. Браузер без дополнительной настройки покажет предупреждение о неизвестном центре сертификации: цепочка доверия для такого сертификата отсутствует. Сертификат Let’s Encrypt устраняет это ограничение для публичного IPv4, если сервис проходит проверку владения адресом.
Практические сценарии:
- короткоживущий стенд, доступный по одному IP;
- служебный HTTP-интерфейс VPS;
- API или устройство, для которого домен не нужен;
- быстрый защищённый сервис с прямым обращением по адресу.
Для пользовательского сайта с устойчивым адресом доменное имя по-прежнему удобнее: его проще запомнить, перенести между серверами и использовать в ссылках.
Подготовка сервера
Начните с обновления пакетов и проверки времени. Центр сертификации учитывает период действия сертификата, поэтому заметное расхождение системных часов способно сорвать ACME-проверку.
sudo apt update && sudo apt upgrade
sudo timedatectl set-timezone Europe/Moscow
date
До включения файрвола определите способ доступа к серверу. В примере SSH перенесён на порт 2222; сначала разрешите его в UFW, поменяйте Port в /etc/ssh/sshd_config, перезапустите SSH и проверьте новое подключение в отдельном терминале. Только после успешной проверки закрывайте порт 22.
sudo ufw allow 2222/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status
Порт 80 нужен для первичной проверки и HTTP-редиректа, а 443 принимает TLS-трафик. Доступ по SSH лучше ограничить ключами; смена порта дополнительно сокращает поток случайных попыток подключения.
Если сервис не должен попадать в поисковую выдачу, положите в каталог сайта файл /var/www/html/robots.txt:
User-agent: *
Disallow: /
Этот файл сообщает правило корректным поисковым роботам. Он не заменяет сетевые ограничения и аутентификацию для закрытого интерфейса.
Выпуск short-lived сертификата
Установите Lighttpd и Certbot. Каталог webroot должен быть доступен по HTTP на публичном IP: Certbot разместит в нём данные для проверки.
sudo apt install lighttpd -y
sudo snap install --classic certbot
Разместите тестовую страницу в /var/www/html/, затем запустите выпуск. Вместо IP-ВАШЕГО-VPS подставьте настоящий публичный IPv4-адрес сервера.
sudo certbot certonly \
--preferred-profile shortlived \
--ip-address IP-ВАШЕГО-VPS \
--webroot \
--webroot-path /var/www/html/
После успешной проверки файлы сертификата появятся в каталоге /etc/letsencrypt/live/IP-ВАШЕГО-VPS/. Укажите действующий почтовый адрес при выпуске: уведомления помогут вовремя заметить проблемы с продлением.
Настройка Lighttpd для HTTPS
Подключите модуль OpenSSL в секции server.modules файла /etc/lighttpd/lighttpd.conf:
server.modules = (
"mod_indexfile",
"mod_access",
"mod_alias",
"mod_redirect",
"mod_openssl",
)
Добавьте TLS-сокет и пути к выпущенным ключам. Минимальная версия TLS в этой конфигурации — 1.2.
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/letsencrypt/live/IP-ВАШЕГО-VPS/fullchain.pem"
ssl.privkey = "/etc/letsencrypt/live/IP-ВАШЕГО-VPS/privkey.pem"
ssl.openssl.ssl-conf-cmd = ("MinProtocol" => "TLSv1.2")
}
Проверьте синтаксис до перезапуска. Ошибка в конфигурации способна оставить сервис недоступным после применения изменений.
sudo lighttpd -tt -f /etc/lighttpd/lighttpd.conf
sudo systemctl restart lighttpd
Редирект HTTP и наблюдение
Современные браузеры часто пробуют HTTPS сразу, однако скрипты, старые клиенты и явно заданный URL с http:// обратятся к порту 80. Перенаправление сохраняет путь запроса и отправляет клиента на тот же IP по HTTPS.
$SERVER["socket"] == ":80" {
$HTTP["host"] =~ "([0-9.]+)" {
url.redirect = ( "^/(.*)" => "https://%1/$1" )
}
}
Снова выполните проверку конфигурации и перезапустите Lighttpd. Для просмотра обращений включите модуль журнала доступа:
sudo /usr/sbin/lighty-enable-mod accesslog
sudo systemctl restart lighttpd
tail -f /var/log/lighttpd/access.log
Журнал удобен для проверки редиректа, ACME-проверок и неожиданных запросов к сервису. Для постоянной эксплуатации добавьте ротацию логов и отслеживание ошибок веб-сервера.
Продление каждые несколько часов
Шестидневный срок сертификата требует автоматического обновления. Запустите certbot renew с регулярной периодичностью и перезапускайте Lighttpd только после фактического продления:
sudo crontab -e
0 */3 * * * certbot renew --quiet --deploy-hook "systemctl restart lighttpd"
Задача стартует раз в три часа. Certbot самостоятельно определяет, нужен ли выпуск нового сертификата; --deploy-hook перезапускает веб-сервер после обновления файлов. Периодически проверяйте выполнение cron-задачи и дату окончания сертификата, особенно после обновления Certbot, изменения файрвола или миграции VPS.
TLS для публичного IP делает защищённое подключение доступным для сервисов с прямым адресом. Надёжность этой схемы обеспечивают открытые порты для проверки, корректное время, рабочий webroot и автоматическое продление.