Дружим Let's Encrypt и Lighttpd за 5 минут!

К сожалению web-сервер Lighttpd не такой популярный, как Apache или Nginx и некоторые скрипты "из коробки" на нём не работают. Чтож, исправим это и подружим его с сертификатами от Let's Encrypt.

Для начала надо скачать бота для автоматического скачивания и обновления сертификатов. Для этого идём по адресу https://certbot.eff.org/, в поле I'm using выбираем None of the above и в поле System свою систему и качаем/ставим пакет. Либо качаем бинарник ручками и даём права на исполнение:

cd /usr/bin
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

Запускаем первый раз бота и отвечаем на его вопросы:

certbot-auto certonly --webroot -w /var/www/example.org/ -d example.org -d www.example.org -d files.example.org

Ключ -w указывает на корень сайта. В нем бот создаст временные папки и файлы для подтверждения домена. Ключи -d указывают домены, для которых необходимо генерировать сертификат. Самый простой вариант пройти валидацию доменов - это добавить их в конфиг Lighttpd. Для этого создадим временный каталог и файл-заглушку:

mkdir /var/www/example.org.tmp
echo 'OK!' > /var/www/example.org.tmp/index.html

Добавляем в /etc/lighttpd/lighttpd.conf строки:

$HTTP["host"] =~ "^example.org|^files.example.org|^www.example.org" {
	evhost.path-pattern = "/var/www/example.org.tmp"
	index-file.names = ( "index.html" )
}

Обратите внимание, что при этом необходимо подключить модуль mod_evhost. После этого перезапускаем Lighttpd командой:

service lighttpd restart

Пробуем браузером зайти на все указанные адреса. При этом мы должны увидить слово 'OK'. После успешной валидации доменов, сертификаты будут сгенерированы и помещены в папку /etc/letsencrypt/live/example.org/. Приступим к подготовке сертификатов под наш web-сервер. Для этого создадим pem-файл:

cd /etc/letsencrypt/live/example.org/
cat privkey.pem cert.pem > pemfile.pem

Добавим сертификаты в конфиг Lighttpd и получаем нечто такое:

$HTTP["host"] =~ "^example.org|^files.example.org|^www.example.org" {
	evhost.path-pattern = "/var/www/example.org.tmp"
	index-file.names = ( "index.html" )
	# Сертификаты
	$SERVER["socket"] == "example.org:443" {
		ssl.engine = "enable"
		ssl.pemfile = "/etc/letsencrypt/live/example.org/pemfile.pem"
		ssl.ca-file = "/etc/letsencrypt/live/example.org/fullchain.pem"
		server.name = "example.org"
	}
	# Включаем переадресацию с http на https
	# Не забываем перед этим подключить модуль mod_redirect
	$HTTP["scheme"] == "http" {
			$HTTP["host"] =~ ".*" {
				url.redirect = (".*" => "https://%0$0")
			}
	}
}

Перезапускаем Lighttpd командой:

service lighttpd restart

Пробуем зайти браузером зайти на любой из указанных адресов. Должно срабатывать автоматическое переключение с http на https и на всех адресах должна показываться иконка шифрованного соединения. Осталось сменить в конфиге путь временного сайта на постоянный и добавить в crontab скрипт автообновления сертификатов:

#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
certbot-auto renew --quiet --no-self-upgrade
cd /etc/letsencrypt/live/example.org/
cat privkey.pem cert.pem > pemfile.pem
service lighttpd restart

Вот и всё. Есть вопросы - есть контакты