Модуль Apache mod_tls
| Описание: | Реализация TLS v1.2 и v1.3 в памяти с безопасностью Rust с использованием библиотеки rustls |
|---|---|
| Статус: | Экспериментальный |
| Идентификатор модуля: | tls_module |
| Файл исходного кода: | mod_tls.c |
| Совместимость: | Доступно в версии 2.4.52 и более поздних |
Краткое описание
mod_tls — это альтернатива mod_ssl для обеспечения https-сервиса. Его функционал является подмножеством, описанным более подробно ниже. Он может использоваться как дополнение к mod_ssl, например, оба модуля могут быть загружены одновременно.
mod_tls, написанный на C, использует реализацию TLS на Rust под названием rustls через свой C-интерфейс rustls-ffi. Это обеспечивает безопасную криптографию и обработку протоколов со сравнимой производительностью.
Он может быть настроен для фронтенд- и бэкенд-соединений. Директивы конфигурации в основном аналогичны mod_ssl.
TLS в контексте VirtualHost
Listen 443 TLSEngine 443 <VirtualHost *:443> ServerName example.net TLSCertificate file_with_certificate.pem file_with_key.pem ... </VirtualHost>
Выше приведена минимальная конфигурация. Вместо включения mod_tls в каждом виртуальном хосте, указывается порт для входящих TLS-соединений.
Вы не можете смешивать виртуальные хосты с mod_ssl и mod_tls на одном порту. Либо одно, либо другое. Поддерживаются SNI и ALPN. Вы можете использовать несколько виртуальных хостов на одном порту и смешивать протоколы, такие как http/1.1 и h2.
Сравнение функциональности с mod_ssl
Таблица ниже показывает сравнение функциональных возможностей mod_ssl и mod_tls. Если функция mod_ssl не указана здесь, она не поддерживается mod_tls. Вероятно, самое существенное отличие — отсутствие поддержки сертификатов клиента в текущей версии mod_tls.
| Функция | mod_ssl | mod_tls | Комментарий |
|---|---|---|---|
| TLS для фронтенда | да | да | |
| TLS для бэкенда | да | да | |
| TLS v1.3 | да* | да | *)с последней OpenSSL |
| TLS v1.2 | да | да | |
| TLS v1.0 | да* | нет | *)если включено в OpenSSL |
| SNI виртуальные хосты | да | да | |
| Сертификаты клиентов | да | нет | |
| Сертификаты машины для бэкенда | да | да | |
| OCSP Stapling | да | да* | *)через mod_md
|
| Проверка OCSP в бэкенде | да | нет* | *)подпись будет проверена |
| Разрешенные версии TLS | мин-макс | мин | |
| TLS шифры | исключительный список | предпочтительный/запрещенный | |
| Порядок шифров TLS | клиент/сервер | клиент/сервер | |
| TLS сессии | да | да | |
| Строгость SNI | по умолчанию нет | по умолчанию да | |
| Опции EnvVars | полный набор | ограниченный* | *)см. список переменных |
| Опция ExportCertData | клиент+сервер | сервер | |
| CA для бэкенда | файл/каталог | файл | |
| Отзыва CRL | да | нет | |
| TLS переподключение | да* | нет | *)в TLS v1.2 |
| Зашифрованные ключи сертификатов | да | нет |
Протоколы TLS
mod_tls поддерживает протоколы TLS версии 1.2 и 1.3. Если когда-нибудь появится версия 1.4 и rustls ее поддержит, она также будет доступна.
В mod_tls настраивается минимальная версия, а не максимальная:
TLSProtocol TLSv1.3+
Это позволяет использовать только версию 1.3 и любые последующие версии при общении с вашим сервером или конкретным виртуальным хостом.
Шифры TLS
Список поддерживаемых шифров TLS в библиотеке rustls можно найти здесь. Все шифры TLS v1.3 поддерживаются. Для TLS v1.2 доступны только шифры, которые rustls считает безопасными.
mod_tls поддерживает следующие имена для шифров TLS:
- Присвоенное IANA имя, использующее `_` для разделения частей. Пример:
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - Имя OpenSSL, использующее `-` в качестве разделителя (для 1.2). Пример:
ECDHE-ECDSA-AES256-SHA384. Такие имена часто встречаются в документации. `mod_tls` определяет их для всех шифров TLS v1.2. Для шифров TLS v1.3 также поддерживаются имена, начинающиеся сTLS13_. - Присвоенный IANA идентификатор, представляющий собой 16-битное числовое значение. Пример:
0xc024. Вы можете использовать его в конфигурациях какTLS_CIPHER_0xc024.
Вы можете настроить предпочтение шифров, что означает, что они будут использоваться для клиентов, которые их поддерживают. Если вы не настроите предпочтение, rustls будет использовать тот, который он считает лучшим. Это рекомендуется.
Тем не менее, если вам необходимо указать приоритет одного шифра над другим, вы можете настроить это следующим образом:
TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384 # or several TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305
Если вы укажете неизвестный шифр, конфигурация завершится ошибкой. Если вы укажете шифр, не поддерживаемый rustls (или больше не поддерживаемый в обновленной версии rustls по соображениям безопасности), mod_tls выведет сообщение WARNING, но продолжит работу.
Аналогичный механизм существует, если вы хотите отключить определенный шифр:
TLSCipherSuppress ECDHE-ECDSA-AES256-SHA384
Запрещенный шифр больше не будет использоваться. Если вы укажете неизвестный шифр, конфигурация завершится ошибкой. Если вы укажете шифр, не поддерживаемый rustls (или больше не поддерживаемый в обновленной версии rustls по соображениям безопасности), mod_tls выведет сообщение WARNING, но продолжит работу.
Виртуальные хосты
mod_tls использует SNI (Server Name Indicator) для выбора одного из настроенных виртуальных хостов, соответствующих порту, который обслуживается. Если клиент не предоставит SNI, будет выбран первый настроенный виртуальный хост. Если клиент предоставит SNI (как это делают все современные клиенты), он должен совпадать с одним виртуальным хостом (ServerName или ServerAlias) или подключение завершится ошибкой.
Как и в случае с mod_ssl, вы можете указать шифры и версии протоколов для базового сервера (глобального) и/или отдельных виртуальных хостов, которые выбираются клиентом по SNI.
Listen 443 TLSEngine 443 <VirtualHost *:443> ServerName example1.net TLSCertificate example1-cert.pem ... </VirtualHost> <VirtualHost *:443> ServerName example2.net TLSCertificate example2-cert.pem ... TLSProtocol v1.3+ </VirtualHost>
Приведенный выше пример показывает разные настройки TLS для виртуальных хостов на одном порту. Это поддерживается. example1 может быть достигнут через все версии TLS, а example2 допускает только v1.3 или более поздние версии.
Сертификаты ACME
Сертификаты ACME через mod_md поддерживаются, как и для mod_ssl. Минимальная конфигурация:
Listen 443 TLSEngine 443 MDomain example.net <VirtualHost *:443> ServerName example.net ... </VirtualHost>
OCSP Stapling
mod_tls не имеет собственной реализации для получения информации OCSP для сертификата. Однако он будет использовать ее для Stapling, если она предоставляется mod_md. См. документацию mod_md по включению этой функции.
Переменные TLS
Через директиву TLSOptions, несколько переменных помещаются в среду запросов и могут быть просмотрены, например, в скрипте CGI.
Имена переменных задаются mod_ssl. Обратите внимание, что это только подмножество многих переменных, которые предоставляет mod_ssl.
| Переменная | TLSOption | Описание |
|---|---|---|
| SSL_TLS_SNI | * | индикатор имени сервера (SNI), отправленный клиентом |
| SSL_PROTOCOL | * | переговоренный протокол TLS |
| SSL_CIPHER | * | имя переговорённого шифра TLS |
| SSL_VERSION_INTERFACE | StdEnvVars | версия модуля |
| SSL_VERSION_LIBRARY | StdEnvVars | версия rustls-ffi |
| SSL_SECURE_RENEG | StdEnvVars | всегда `false` |
| SSL_COMPRESS_METHOD | StdEnvVars | всегда `false` |
| SSL_CIPHER_EXPORT | StdEnvVars | всегда `false` |
| SSL_CLIENT_VERIFY | StdEnvVars | всегда `false` |
| SSL_SESSION_RESUMED | StdEnvVars | либо `Resumed`, если клиент представил известный идентификатор TLS-сессии, либо `Initial` в противном случае |
| SSL_SERVER_CERT | ExportCertData | выбранный серверный сертификат в формате PEM |
Переменная SSL_SESSION_ID намеренно не поддерживается, так как содержит конфиденциальную информацию.
Сертификаты клиентов
Хотя rustls поддерживает сертификаты клиентов в принципе, часть инфраструктуры для использования этих сертификатов на сервере не реализована.
К этим функциям относятся: списки отзыва, проверка расширений сертификатов и сопоставленной цепочки выдачи для проверки OCSP. Без них отзыв сертификатов клиента невозможен. Предложение аутентификации без отзыва не рассматривается.
Работа над этим будет продолжена, и поддержка сертификатов клиентов может стать доступной в будущей версии.
Директива TLSCertificate
| Описание: | добавляет сертификат и ключ (в кодировке PEM) на сервер/виртуальный хост. |
|---|---|
| Синтаксис: | TLSCertificate cert_file [key_file] |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
Если вы не укажете отдельный файл ключа, ключ предполагается в первом файле. Вы можете добавить более одного сертификата на сервер/виртуальный хост. Затем выбирается первый сертификат, подходящий для клиента.
Путь может быть указан относительно корня сервера.
Директива TLSCiphersPrefer
| Описание: | определяет предпочтительные шифры. |
|---|---|
| Синтаксис: | TLSCiphersPrefer cipher(-list) |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
Это не отключит шифры, поддерживаемые `rustls`. Если вы укажете неизвестный шифр, конфигурация завершится ошибкой. Если вы укажете известный, но не поддерживаемый `rustls` шифр, будет выведено предупреждение, но сервер продолжит работу.
Пример
TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305
В примере 2 шифра имеют предпочтение перед другими, в порядке их упоминания.
Директива TLSCiphersSuppress
| Описание: | определяет шифры, которые не должны использоваться. |
|---|---|
| Синтаксис: | TLSCiphersSuppress cipher(-list) |
| Контекст: | настройка сервера, виртуальный хост |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
Это не отключит любые не упомянутые шифры, поддерживаемые `rustls`. Если вы укажете совершенно неизвестный шифр, конфигурация завершится ошибкой. Если вы укажете известный, но не поддерживаемый `rustls` шифр, будет выведено предупреждение, но сервер продолжит работу.
Пример
TLSCiphersSuppress ECDHE-ECDSA-CHACHA20-POLY1305
Пример удаляет шифр для использования в соединениях.
Директива TLSEngine
| Описание: | определяет, на каком адресе и порту модуль должен обрабатывать входящие подключения. |
|---|---|
| Синтаксис: | TLSEngine [address:]port |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
Эта настройка задаётся на глобальном уровне, а не в отдельных <VirtualHost>. Она повлияет на все <VirtualHost> , которые соответствуют указанному адресу/порту. Вы можете использовать TLSEngine несколько раз, чтобы использовать более одного адреса/порта.
Пример
TLSEngine 443
В примере модулю mod_tls сообщается о необходимости обработки входящих подключений на порту 443 для всех слушателей.
Директива TLSHonorClientOrder
| Описание: | определяет, учитывается ли порядок шифров, поддерживаемых клиентом |
|---|---|
| Синтаксис: | TLSHonorClientOrder on|off |
| Значение по умолчанию: | TLSHonorClientOrder on |
| Контекст: | настройка сервера, виртуальный хост |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
TLSHonorClientOrder определяет, учитывается ли порядок шифров, поддерживаемых клиентом.
Директива TLSOptions
| Описание: | включает переменные SSL для запросов. |
|---|---|
| Синтаксис: | TLSOptions [+|-]option |
| Контекст: | настройка сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
TLSOptions аналогично SSLOptions в mod_ssl. Она может быть установлена для каждого каталога/местоположения, и `option` может быть:
- `StdEnvVars`: добавляет больше переменных в среду запроса, например, для передачи в обработку CGI и других приложений.
- `ExportCertData`: добавляет переменные, связанные с сертификатом, в среду запроса.
- `Defaults`: сбрасывает все параметры до их значений по умолчанию.
Добавление переменных в среду запроса увеличивает нагрузку, особенно при необходимости проверки сертификатов и извлечения полей. Поэтому большинство переменных не устанавливаются по умолчанию.
Вы можете настроить TLSOptions для каждого местоположения или в целом на сервере/виртуальном хосте. Префикс `-` отключает этот параметр, оставляя остальные без изменений. Префикс `+` эквивалентен записи параметра без префикса.
Значение `Defaults` может быть использовано для сброса любых параметров, унаследованных от других местоположений или виртуального хоста/сервера.
Пример
<Location /myplace/app> TLSOptions Defaults StdEnvVars ... </Location>
Директива TLSProtocol
| Описание: | устанавливает минимальную версию протокола TLS для использования. |
|---|---|
| Синтаксис: | TLSProtocol version+ |
| Значение по умолчанию: | TLSProtocol v1.2+ |
| Контекст: | настройка сервера, виртуальный хост |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
По умолчанию `v1.2+`. Установка на `v1.3+` отключит TLSv1.2.
Директива TLSProxyCA
| Описание: | устанавливает корневые сертификаты для проверки сервера бэкенда. |
|---|---|
| Синтаксис: | TLSProxyCA file.pem |
| Контекст: | настройка сервера, виртуальный хост, раздел прокси |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
Директива TLSProxyCiphersPrefer
| Описание: | определяет предпочтительные шифры для подключения прокси. |
|---|---|
| Синтаксис: | TLSProxyCiphersPrefer cipher(-list) |
| Контекст: | настройка сервера, виртуальный хост, раздел прокси |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
Это не отключит любые поддерживаемые `rustls` шифры. Если вы укажете совершенно неизвестный шифр, конфигурация завершится ошибкой. Если вы укажете известный, но не поддерживаемый `rustls` шифр, будет выведено предупреждение, но сервер продолжит работу.
Директива TLSProxyCiphersSuppress
| Описание: | определяет шифры, которые не должны использоваться для подключения прокси. |
|---|---|
| Синтаксис: | TLSProxyCiphersSuppress cipher(-list) |
| Контекст: | настройка сервера, виртуальный хост, раздел прокси |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
Это не отключит любые не упомянутые шифры, поддерживаемые `rustls`. Если вы укажете совершенно неизвестный шифр, конфигурация завершится ошибкой. Если вы укажете известный, но не поддерживаемый `rustls` шифр, будет выведено предупреждение, но сервер продолжит работу.
Директива TLSProxyEngine
| Описание: | включает TLS для подключений бэкенда. |
|---|---|
| Синтаксис: | TLSProxyEngine on|off |
| Контекст: | настройка сервера, виртуальный хост, раздел прокси |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
TLSProxyEngine аналогично SSLProxyEngine в mod_ssl.
Это может быть использовано в разделе сервера/виртуального хоста или <Proxy> для включения модуля для исходящих подключений с использованием mod_proxy.
Директива TLSProxyMachineCertificate
| Описание: | добавляет файл сертификата и ключа (в формате PEM) к настройке прокси. |
|---|---|
| Синтаксис: | TLSProxyMachineCertificate cert_file [key_file] |
| Контекст: | настройка сервера, виртуальный хост, раздел прокси |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
Сертификат используется для аутентификации на сервере бэкенда прокси.
Если вы не указали отдельный файл ключа, ключ предполагается в том же файле. Вы можете добавить более одного сертификата к настройке прокси. Первый подходящий сертификат для подключения прокси к бэкенду выбирается затем rustls.
Путь может быть указан относительно корня сервера.
Директива TLSProxyProtocol
| Описание: | устанавливает минимальную версию протокола TLS для использования в подключениях прокси. |
|---|---|
| Синтаксис: | TLSProxyProtocol version+ |
| Значение по умолчанию: | TLSProxyProtocol v1.2+ |
| Контекст: | настройка сервера, виртуальный хост, раздел прокси |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
По умолчанию `v1.2+`. Установка на `v1.3+` отключит TLSv1.2.
Директива TLSSessionCache
| Описание: | устанавливает кэш для возобновления сеансов TLS. |
|---|---|
| Синтаксис: | TLSSessionCache cache-spec |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
Использует кэш на стороне сервера, чтобы позволить клиентам возобновить подключения.
Вы можете установить это на `none` или определить кэш, как в директиве SSLSessionCache модуля mod_ssl.
Если не настроено, `mod_tls` попытается создать кэш в общей памяти, используя спецификацию `shmcb:tls/session-cache`. Если это не удастся, будет выведено предупреждение, но сервер продолжит работу.
Директива TLSStrictSNI
| Описание: | вынуждает точное соответствие индикаторов клиента сервера (SNI) именам хостов. |
|---|---|
| Синтаксис: | TLSStrictSNI on|off |
| Значение по умолчанию: | TLSStrictSNI on |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_tls |
Подключения клиентов с использованием SNI будут неуспешными, если соответствие не найдено.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_tls.html