Настройка доступа по HTTPS в Lighttpd в Debian

- Опубликовано в Linux - Permalink

Мировым стандартом и обязательным требованием является защита передаваемых данных, в частности использование защищенного протокола 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 были настроены правильно, и при перевыспуске сертификатов ошибок не возникнет.