Настраиваем Apache + SSL для работы по HTTPS с сертификатами Let's Encrypt
Сегодня защищенное соединение перестало быть уделом сайтов, работающих с пользовательскими данными, а стало насущной необходимостью для всех, даже если у вас простой блог о личном увлечении. Большинство современных браузеров при заходе на простой HTTP-сайт уже указывают в адресной строке, что подключение не защищено, но в скором будущем начнут помечать такие сайты как небезопасные. Тем более что с приходом Let's Encrypt шифрование стало доступно каждому и настроить его несложно, о чем мы и расскажем в данной статье.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе
"Архитектура современных компьютерных сетей"
вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов.
На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Начнем мы с наиболее популярного веб-сервера Apache, первоначальная настройка которого выполнена по нашей статье: Настраиваем веб-сервер на базе Apache в Debian / Ubuntu Server. В данной статье будет использоваться Apache 2.4 установленный в среде Debian 10, но все сказанное ниже будет справедливо для любого основанного на Debian или Ubuntu дистрибутива, а с некоторыми поправками - для любой Linux системы.
Будем считать, что у нас уже настроен как минимум один виртуальный хост, на котором работает сайт, допустим, example.com, минимальная конфигурация виртуального хоста должна выглядеть примерно так:
1<VirtualHost *:80>
2 ServerName example.com
3 ServerAdmin mail@example.com
4 ServerAlias www.example.com
5 DocumentRoot /var/www/example.com
6 CustomLog ${APACHE_LOG_DIR}/example.com.access.log combined
7 ErrorLog ${APACHE_LOG_DIR}/example.com.error.log
8 <Directory /var/www/example.com>
9 Options -Includes -Indexes -ExecCGI
10 AllowOverride All
11 </Directory>
12</VirtualHost>
Мы не будем подробно описывать значение опций, это сделано в указанной нами статье, а конфигурация приведена для примера, на который мы будем опираться в дальнейшем по ходу статьи.
Прежде всего нам потребуется настроить веб-сервер для работы с Let's Encrypt, сделав так, чтобы сертификаты можно было легко получать для любого обслуживаемого сервером сайта без дополнительных настроек. Создадим для этого специальную директорию:
1mkdir /var/www/letsencrypt
И сделаем ее владельцем веб сервер:
1chown -R www-data:www-data /var/www/letsencrypt
Затем создадим файл конфигурации для Аpache:
1touch /etc/apache2/conf-available/le.conf
и внесем в него следующий текст:
1Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
2
3<Directory "/var/www/letsencrypt/.well-known/acme-challenge/">
4 Options None
5 AllowOverride None
6 ForceType text/plain
7 Require all granted
8 RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
9</Directory>
Эта настройка будет перенаправлять все запросы к /.well-known/acme-challenge любого сайта в созданную нами директорию /var/www/letsencrypt.
Подключим конфигурационный файл:
1a2enconf le
и проверим конфигурацию на ошибки:
1apachectl -t
Затем перезапустим веб-сервер
1service apache2 restart
Следующим шагом установим certbot, в современных дистрибутивах он включен в репозитории, поэтому достаточно выполнить:
1apt install certbot
Если вы используете более старые дистрибутивы, то обратитесь к нашей статье: Получаем сертификаты Let's Encrypt при помощи Certbot
Пакет не требует начальной настройки и готов к работе сразу после установки. Перед тем, как получать сертификат, убедитесь, что к вашему серверу есть доступ из интернета. В любом случае советуем сначала выполнить пробное получение:
1certbot certonly --dry-run --webroot -w /var/www/letsencrypt -d example.com -d www.example.com
За тестовый режим отвечает ключ --dry-run, ключ --webroot указывает используемый плагин, в нашем случае отвечающий за работу с уже имеющемся веб-сервером. Опция**-w** указывает корневую директорию для Let's Encrypt, которую мы создали и настроили ранее, а через ключи**-d** перечисляются домены и поддомены, для которых требуется получить сертификат. Если все прошло успешно вы получите лаконичное сообщение:
1certbot certonly --webroot -w /var/www/letsencrypt -d example.com -d www.example.com
Теперь вы получите более информативное сообщение, содержащее информацию о расположении полученных сертификатов и сроков их действия:
1[renewalparams]
2...
3renew_hook = service apache2 reload
Порядок расположения опций значения не имеет. Параметр renew_hook позволяет указать действие, которое следует выполнить при успешном продлении сертификата, в нашем случае это перезапуск веб-сервера Apache.
Сертификат получен, можно переходить к настройке виртуального хоста для работы сайта по защищенному протоколу, рекомендуем скопировать текущий файл конфигурации и вносить настройки в него:
1cp /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-available/example.com-ssl.conf
Затем откроем его и сразу изменим порт с 80 на 443:
1<VirtualHost *:443>
Также советуем изменить имена файлов логов:
1CustomLog ${APACHE_LOG_DIR}/example.com-ssl.access.log combined
2ErrorLog ${APACHE_LOG_DIR}/example.com-ssl.error.log
Ниже добавим:
1SSLEngine on
2
3SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
4SSLCertificateChainFile /etc/letsencrypt/live/example.com/fullchain.pem
5SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
6SSLCACertificateFile /etc/letsencrypt/live/example.com/chain.pem
Эти опции включают SSL и указывают пути к сертификатам. В теории этого достаточно, но в современных условиях такие настройки не будут надежными, так как разрешают использование устаревших протоколов и нестойких шифров. Для получения современной и актуальной конфигурации SSL мы советуем воспользоваться сервисом moz://a SSL Configuration Generator, который предлагает несколько вариантов настроек, оптимальным является использование опции Intermediate.
Но не следует добавлять сразу все опции, ряд из них могут иметь достаточно "неожиданное" действие на неподготовленного пользователя. Поэтому сначала разберемся с шифрами и протоколами:
1SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
2SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
Первая опция отключает устаревшие и небезопасные протоколы SSLv3, TLS 1.0 и TLS 1.1, вторая задает доступные к использованию шифры. Создание набора шифров - это наиболее сложная задача, поэтому лучше довериться специалистам Mozilla, нежели изобретать велосипед самостоятельно.
Затем добавим:
1SSLHonorCipherOrder off
2SSLSessionTickets off
Первая строка определяет приоритет при выборе шифра, включенная опция отдает приоритет серверу, выключенная - браузеру клиента. В целях совместимости следует отдавать приоритет выбору клиента, а выбор сервера использовать только тогда, когда требуется принудительно использовать максимально стойкое шифрование. Вторая отключает использование сессионных билетов SSL, что требуется для обеспечения режима совершенной прямой секретности.
Также разрешим использование протокола HTTP/2, если это возможно:
1Protocols h2 http/1.1
Сохраним файл конфигурации и подключим его:
1a2ensite example.com-ssl
Также нам потребуется модуль SSL:
1a2enmod ssl
Проверим конфигурацию и перезапустим веб-сервер:
1apachectl -t
2service apache2 restart
После чего откройте сайт, явно указав протокол https://example.com
На этом этапе вы можете столкнуться с проблемой смешанного содержимого, когда определенные ресурсы сайта, например, изображения или скрипты загружаются по незащищенному протоколу HTTP. Если к первым браузеры относятся относительно лояльно, просто убирая "замочек" в адресной строке, то вторые по умолчанию блокируются. Поэтому внимательно изучите код вашего сайта и замените везде, где это возможно, получение ресурсов на защищенный протокол HTTPS. Если это невозможно, то от таких ресурсов следует отказаться.
Добившись идеальной работы сайта по HTTPS, двинемся дальше, сначала включим технологию HSTS, которая принудительно активирует защищенное соединение, если сайт хоть один раз был успешно через него загружен. При использовании данного механизма браузер будет принудительно переключаться на HTTPS даже если в строке подключения пользователь явно укажет протокол HTTP, это позволяет успешно бороться с атаками на понижение степени защиты.
Для этого добавим в конфигурацию виртуального хоста строку:
1Header always set Strict-Transport-Security "max-age=63072000"
Также включим механизм OCSP Stapling, который позволяет ускорить проверку сертификата клиентом, что особенно важно для мобильных пользователей. Добавим строку:
1SSLUseStapling On
Однако этого недостаточно, сохраним настройки виртуального хоста и снова откроем файл /etc/apache2/conf-available/le.conf, куда добавим:
1SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
Для работы вышеперечисленных опций нам потребуется модуль Headers:
1a2enmod headers
Снова проверяем конфигурацию и перезапускаем сервер:
1apachectl -t
2service apache2 restart
Самое время проверить HSTS в действии: перейдите на сайт по защищенному протоколу, а затем попробуйте открыть его HTTP версию, если HSTS работает, то у вас это не получится.
И в завершение настроим перенаправление клиентов с HTTP версии сайта на HTTPS, для этого откроем настройки виртуального хоста HTTP версии /etc/apache2/sites-available/example.com.conf и удалим из него все строки кроме:
1<VirtualHost *:80>
2 ServerName example.com
3 ServerAdmin mail@example.com
4 ServerAlias www.example.com
5</VirtualHost>
А затем добавим:
1RewriteEngine On
2RewriteCond %{HTTPS} off
3RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Сохраним файл конфигурации и подключим модуль Rewrite:
1a2enmod rewrite
И еще раз перезапустим сервер, не забыв проверить конфигурацию:
1apachectl -t
2service apache2 restart
Теперь наш сервер настроен с учетом всех современных методик, проверить это можно на сайте SSL Labs, с текущими настройками была получена высшая оценка A+:
Как видим, настроить веб-сервер Apache для работы по HTTPS совсем несложно. А Let's Encrypt обеспечит бесплатное получение и обновление сертификатов в автоматическом режиме. Если вы заметили, то мы ничего не писали про настройку автообновления, Certbot все уже сделал за нас.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе
"Архитектура современных компьютерных сетей"
вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов.
На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Помогла статья? Поддержи автора и новые статьи будут выходить чаще: