Настройка доступа по HTTPS в Lighttpd в Debian
Мировым стандартом и обязательным требованием является защита передаваемых данных, в частности использование защищенного протокола HTTPS для веб-сайтов. Передаваемые данные шифруются специальным ключом, что предотвращает перехват и подмену данных, повышает доверие пользователей к веб-ресурсу, а также соответствует требованиям современных браузеров. В этой статье показано как настроить доступ к веб-сайту по протоколу HTTPS в Lighttpd в Debian 13.
Суть использования протокола HTTPS лежит в использовании защищенного канала передачи данных между сервером и клиентом с использованием сертификатов безопасности криптографического протокола TLS (Transport Layer Security), наследника SSL (Secure Sockets Layer). Так как протоколы связи могут использоваться как с шифрованием, так и без него, при установке соединения необходимо явно указать серверу, что клиент хочет установить то или иное соединение. Как правило, это может быть достигнуто либо с помощью указания унифицированного номера порта связи (80 для HTTPS, 443 для HTTPS), либо явного указания желаемого протокола (http:// и https:// соответственно).
При этом важно, чтобы сертификат был выпущен доверенным центром сертификации. Существуют как платные, так и бесплатные центры сертификации. Бесплатным и надежным ЦС является проект Let's Encrypt - сертификаты этого ЦС выпускаются бесплатно, признаются всеми современными браузерами, а также поддерживают автоматизированный выпуск и обновление сертификатов.
Подготовка к установке
Для начала необходимо изменить настройки веб-сервера. В основном файле настроек необходимо указать использование порта 80, вместо стандартного 8080. Необходимо найти строку server.port и изменить значение, после чего сохранить и закрыть файл настроек:
$ sudo nano /etc/lighttpd/lighttpd.conf
Веб-сервер Lighttpd использует модульную архитектуры, обеспечение работы с криптографическими протоколами SSL/TLS осуществляется с помощью модуля mod_openssl. Модуль необходимо включить в конфигурацию с помощью команды:
$ sudo lighty-enable-mod ssl
Также, если нет необходимости использовать веб-ресурс с указанием www в адресе и, соответственно, нет необходимости выпускать сертификат на такой домен, можно включить модуль mod_no-www с помощью команды:
$ sudo lighty-enable-mod no-www
Теперь необходимо временно остановить веб-сервер для корректного проведения процедуры выпуска сертификата:
$ sudo systemctl stop lighttpd
Установка Certbot
Для выпуска и автоматического обновления TLS-сертифкатов Let's Encrypt используется инструмент Certbot - он входит в официальный репозиторий Debian. Certbot автоматизирует процесс получения сертификатов, выполняя проверку владения доменом, контролирует срок действия сертификатов и, при необходимости, автоматически перевыпускает сертификаты, у которых заканчивается срок действия. Такой подход практически нивелирует возможность возникновения ошибок при ручном (пере)выпуске сертификатов. Certbot имеет несколько режимов работы и имеет модули совместимости с самыми популярными веб-серверами (Apache, Nginx), однако, с Lighttpd необходима небольная дополнительная настройка. Установка пакета Certbot выполняется следующей командой:
$ sudo apt install certbot
Выпуск сертификата
После установки Certbot можно приступить к выпуске сертификата. Для получения сертификата необходимо выполнить команду:
$ sudo certbot certonly --standalone -d your.domain -d www.your.domain
Параметры команды:
certonly- указывает, что необходимо только выпустить сертификат, не внося изменения в настройки веб-сервера.--standalone- опция заставляет Certbot запустить собсвенный веб-сервер для проверки владения доменом. Из-за этой опции необходимо было ранее остановить Lighttpd.-d your.domain- доменное имя, для которого запрашивается сертификат.-d www.your.domain- доменное имя сwww, если было решено его использовать.
После запуска Certbot сделает следующее:
- Попросит указать E-mail для отправки уведомлений от центра сертификации. Прим.: по моему опыту использование российских e-mail (
@yandex.ru,@mail.ru) не работает, это не блокирует работу Certbot, сертификаты валидны, но и письма на такие адреса не приходят. - Попросит подтвердить согласие на с условиями предоставления сервиса, без принятия которых Certbot откажет произвести регистрацию на ACME-сервере и, следовательно, выпустить сертификат.
- Попросит разрешение на передачу указанного ранее E-mail в организацию EFF - основному партнеру Let's Encrypt и разработчику Certbot. На этот вопрос можно ответить отрицательно, на выпуск сертификата это не повлияет.
- Выполнит запрос на регистрацию аккаунта в системе Let's Encrypt и получит данные о выпущенном TLS-сертификате.
После успешного завершения процедуры Certbot сообщит о сохранении файла с данными сертификата в /etc/letsencrypt/live/your.domain/fullchain.pem и файла секретного ключа, которым будут шифроваться соединения, в /etc/letsencrypt/live/your.domain/privkey.pem.
Настройка HTTPS-подключения в Lighttpd
В результате выполнения предыдущей команды центр сертификации выдаст TLS-сертификат для указанного домена. Далее необходимо внести изменения в настройки конфигурации веб-сервера для возможности получения доступа к сайту по HTTPS. Нужно открыть для редактирования конфигурационный файл Lighttpd:
$ sudo nano /etc/lighttpd/conf-available/10-ssl.conf
В файле необходимо изменить значение параметра ssl.pemfile на путь к файлу сертификата, ранее указанному при завершении работы утилиты Certbot:
ssl.pemfile = "/etc/letsencrypt/live/your.domain/fullchain.pem"
Затем необходиом добавить строку с параметром ssl.privkey, значение которого соответствует пути к файлу секретного ключа:
ssl.privkey = "/etc/letsencrypt/live/your.domain/privkey.pem"
Также желательно добавить в конфигурационный файл строку, которая включит на веб-сервере перенаправления всех HTTP-запросов на HTTPS. Это закроет возможность передачи данных в незашифрованном виде. Необходимо добавить в конец файла следующие строки:
$HTTP["scheme"] == "http" {
url.redirect = ( "" => "https://${url.authority}${url.path}${qsa}" )
}
После чего нужно сохранить файл конфигурации и запустить ранее остановленную службу Lighttpd:
$ sudo systemctl start lighttpd
Если служба стартовала без ошибок, можно запустить браузер и проверить доступ к странице веб-сайта. При подключении к сайту должен использоваться протокол HTTPS.
Расширенная настройка Certbot
После выпуска сертификата, Certbot также включает сервис-таймер certbot.timer для проверки срока действия всех выпущенных сертификатов и, при необходимости, запускает автоматическую процедуру перевыпуска сертификатов. Однако, так как для Certbot нет модуля управления Lighttpd и при выпуске сертификата использовалась опция standalone, необходимо добавить дополнительные настройки Certbot для полной автоматизации в связке с Lighttpd.
Опция standalone указывает, что Certbot будет запускать собственный веб-сервер для проверки владени доменом, однако, при запущенном Lighttpd, Certbot будет конфликтовать с Lighttpd за порт 80 при попытке перевыпуска сертификата. В качестве обходного варианта можно воспользоваться механизмом renewal hooks в Certbot. Для этого необходимо открыть для редактирования файл конфигурации:
$ sudo nano /etc/letsencrypt/renewal/your.domain.conf
После чего в строках pre_hook и post_hook указать следующее:
pre_hook = service lighttpd stop
...
post_hook = service lighttpd start
Для проверки операции по перевыпуске сертификатов можно выполнить следующую команду:
$ sudo certbot renew --dry-run
Если в процессе работы не было ошибок, значит renewal hooks были настроены правильно, и при перевыспуске сертификатов ошибок не возникнет.