Веб-сервер Lighttpd - включаем поддержку SSL.

  • Автор:

lighttpd-ssl-000.jpgПротокол HTTP, широко применяемый в сети интернет, на сегодняшний день безопасным считаться не может. Данные, передаваемые в открытом виде, могут стать легкой добычей злоумышленников, особенно в открытых Wi-Fi сетях, поэтому все большее количество сайтов использует для защиты передаваемых данных протокол HTTPS, поддерживающий шифрование данных при помощи SSL (TLS). Сегодня мы рассмотрим, как добавить поддержку SSL веб-серверу на базе lighttpd.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Сразу внесем небольшую ясность, от чего защищает протокол HTTPS, а от чего нет. Во-первых, работа сайта через защищенное соединение никоим образом не говорит о том, что ему можно доверять. Приобрести сертификат, в т.ч. бесплатно, может любой желающий.

Во-вторых, данные защищаются только на участке передачи между пользователем и сайтом, а как их будет использовать владелец и насколько безопасно они хранятся - вопрос абсолютно иного характера. Поэтому не следует вводить на сайтах, которым вы не доверяете или не имеете достаточных оснований доверять, свои персональные и, тем более, финансовые данные.

В тоже время работа сайта через защищенный протокол гарантирует, что ваш пароль от почтового ящика, личного кабинета или учетной записи на популярном ресурсе не станут известны любому желающему, когда вы сидите с планшетом в кафе. Также это означает, что вся передаваемая в процессе соединения информация будет зашифрована и недоступна третьим лицам, т.е. HTTPS-трафик невозможно анализировать и фильтровать на промежуточных узлах, например, на шлюзе организации.

Также, в процессе настройки SSL для своего сервера вы столкнетесь с рядом ограничений. Основное из них: это возможность иметь на одном IP-адресе только один защищенный хост (сайт). Это ограничение связано с архитектурными особенностями защищенных протоколов и может быть обойдено несколькими способами.

  • Первый и самый проcтой способ - приобрести необходимое число дополнительных IP-адресов. В настоящее время не всегда может быть доступен ввиду дефицита адресов IPv4.
  • Второй способ - это покупка мультидоменного сертификата. К недостаткам данного способа относится его высокая стоимость и необходимость при добавлении нового домена перевыпускать сертификат.
  • Третий способ - использование технологии SNI (Server Name Indication), которая позволяет размещать на одном IP-адресе произвольное количество защищенных хостов. Несмотря на то, что почти все современные веб-сервера поддерживают эту технологию, существенным ограничением является отсутствие ее поддержки во всех версиях Internet Explorer работающих в Windows XP.

Однако, в большинстве случаев, защитить требуется один единственный сайт или его часть (админ-панель, личный кабинет и т.п.), в данной статье мы рассмотрим именно такую ситуацию. Для этих целей отлично подойдет бесплатный сертификат от StartSSL, либо от любого другого центра сертификации.

Также подразумевается, что у вас уже есть развернутый согласно нашим рекомендациям веб-сервер с поддержкой виртуальных хостов.

Прежде всего вам следует получить сертификат для вашего домена и поддомена www. В противном случае при заходе через www.example.com пользователи будут получать ошибку проверки подлинности.

Повысим права до уровня суперпользователя:

sudo -s

и создадим директорию для хранения сертификатов:

mkdir /etc/lighttpd/ssl

Теперь скопируем в нее полученный сертификат и закрытый ключ. Так как закрытый ключ поставляется в зашифрованном виде, его потребуется расшифровать. Перейдем в каталог с сертификатами:

cd /etc/lighttpd/ssl

и выполним команду:

openssl rsa -in private.key -out private-dec.key

Где private.key - ваш закрытый ключ. Затем объединим ключ и сертификат в один PEM-файл:

cat private-dec.key host.crt > host.pem

В нашем случае host.crt - имя сертификата. После чего исходные файлы следует удалить, расшифрованный ключ удалить нужно обязательно.

Установим необходимые права доступа:

chown root:root host.pem
chmod 400 host.pem

Затем перейдем в /etc/lighttpd/conf-available и откроем файл 10-ssl.conf, который содержит готовую заготовку для включения HTTPS-сервера. Приведем его содержимое к следующему виду:

$SERVER["socket"] == "0.0.0.0:443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/ssl/host.pem"
server.document-root = "/var/www/example.com"
server.name = "example.com"
server.errorlog = "/var/log/lighttpd/example.com-ssl-error.log"
accesslog.filename = "/var/log/lighttpd/example.com-ssl-access.log"
}

Чтобы включить поддержку SSL нужно сделать символьную ссылку с этого файла в каталог /etc/lighttpd/conf-enabled:

ln -s /etc/lighttpd/conf-available/10-ssl.conf /etc/lighttpd/conf-enabled

Перезапустим веб-сервер:

service lighttpd restart

Допустим, на нашем сервере работает некоторый сайт, который доступен по HTTP, если теперь мы наберем в начале адресной строки HTTPS, то сайт должен открыться с использованием защищенного протокола, однако вы можете столкнуться с предупреждением безопасности браузера о том, что подлинность сертификата не может быть проверена.

lighttpd-ssl-001.jpgДальнейшие действия заключаются в добавлении серверу цепочки необходимых сертификатов центра сертификации. Несмотря на общий принцип, детали у разных центров сертификации могут различаться и поэтому следует обратиться к документации или в поддержку. В нашем примере будет рассматриваться установка сертификатов для StartSSL.

Переходим на сайт центра сертификации с скачиваем два сертификата: StartCom Root CA и Class 1 Intermediate Server CA.

lighttpd-ssl-002.jpgТакже скопируем их в /etc/lighttpd/ssl и объединим в один командой, предварительно перейдя в каталог с сертификатами:

cd /etc/lighttpd/ssl
cat sub.class1.server.ca.pem ca.pem > startssl-ca.crt

Исходные файлы также следует удалить. В /etc/lighttpd/conf-available/10-ssl.conf добавим следующую опцию:

ssl.ca-file = "/etc/lighttpd/ssl/startssl-ca.crt"

Перезапустим веб-сервер и обновим страницу в браузере:

lighttpd-ssl-003.jpgКак видим, теперь браузер может проследить всю цепочку сертификатов и сайт открывается без ошибок.

Теперь осталось решить задачу с перенаправлением всех HTTP-запросов к вашему сайту на HTTPS-версию. Для этого в В /etc/lighttpd/conf-available/10-ssl.conf добавим еще одну секцию:

$SERVER["socket"] == ":80" {
$HTTP["host"] =~ "example.com" {
url.redirect = ("^/(.*)" => "https://example.com/$1")
server.name = "example.com"
}
}

В иных случаях нет необходимости защищать весь сайт, кроме некоторых его разделов, например админ-панели или личного кабинета. Допустим, нам надо защитить содержимое каталога /administrator, для этого изменим секцию следующим образом:

url.redirect = ("^/administrator/.*" => "https://example.com$0")

Еще одна распространенная задача - защита панелей управления хостингом, сервером и т.п., например phpMyAdmin. Особенность их использования такова, что они доступны для любого виртуального хоста сервера и даже по IP-адресу. Т.е. адреса example.com/phpmyadmin и example.org/phpmyadmin, и даже xxx.xxx.xxx.xxx/phpmyadmin будут работать одинаково. В этом случае нам надо перенаправить запрос к каталогу /phpmyadmin любого хоста на хост example.com/phpmyadmin. Для этого приведите секцию к следующему виду:

$HTTP["url"] =~ "^/phpmyadmin" {
url.redirect = ( "^/(.*)" => "https://example.com/$1" )
server.name = "example.com"
}

После чего запрос к любому хосту содержащий в адресе /phpmyadmin будет перенаправлен на https://example.com/phpmyadmin.

При необходимости можно сочетать несколько правил в пределах секции, например конструкция:

$SERVER["socket"] == ":80" {
$HTTP["host"] =~ "example.com" {
url.redirect = ("^/administrator/.*" => "https://example.com$0")
server.name = "example.com"
}
$HTTP["url"] =~ "^/phpmyadmin" {
url.redirect = ( "^/(.*)" => "https://example.com/$1" )
server.name = "example.com"
}
}

Будет сочетать в себе два вышеописанных случая: редирект на защищенное соединение админки сайта example.com и панели phpMyAdmin вне зависимости от хоста. Также следует изучить документацию на используемый движок, многие из них имеют встроенные механизмы для переключения на защищенное соединение для авторизации или админ-панели.

Дополнительные материалы:

  1. Настраиваем простой веб-сервер на базе lighttpd.
  2. Веб-сервер Lighttpd - настраиваем виртуальные хосты.
  3. Веб-сервер Lighttpd - включаем поддержку SSL.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.


Loading Comments