OpenVPN tls-ciphersuites против tls-version-min: что именно задаёт каждый
Список наборов TLS 1.3 не ограничивает версию протокола, а show-tls показывает только локальную поддержку. Проверяйте политику, наборы и согласованные результаты по отдельности.
Три разных факта в большинстве обсуждений OpenVPN и TLS сводятся в одну строку: что умеет ваша сборка клиента, что разрешает профиль и о чём фактически договорилась сессия. Короткий список наборов TLS 1.3 отвечает лишь наполовину на средний вопрос и ничего не говорит о нижней границе версии протокола. Пройдите проверки ниже по порядку и остановитесь на первой, которая не выполняется, потому что каждая следующая предполагает, что предыдущие уже решены.
Проверьте сборку, прежде чем читать любой список
Директива конфигурации не может добавить поддержку протокола в бинарный файл, у которого её нет. Начните с баннера версии, который называет скомпилированную криптографическую библиотеку:
openvpn --version
Сборка 2.6, слинкованная с OpenSSL, принимает и tls-cipher, и tls-ciphersuites. Сборка с mbed TLS вообще не имеет выбора наборов TLS 1.3, а руководство 2.6 помечает tls-ciphersuites как опцию OpenSSL. Если сервер пересобран с другим backend, тот же профиль может изменить поведение, не изменив ни одной строки конфигурации.
Пока вы здесь, запустите openvpn --show-tls и сохраните вывод. Это инвентарь, с которым вы будете сравнивать позже, и дёшево зафиксировать его до того, как кто-то начнёт редактировать профили.
Запишите баннер и список в тикет изменения, а не в окно чата. Когда два человека спорят, сможет ли клиент через шесть недель предложить набор, зафиксированный вывод решает это одной строкой.
Держите границы версии отдельно от списков шифров
В руководстве 2.6 это три элемента управления, а не один:
tls-cipherзадаёт политику шифров для TLS 1.2 и более старых версий и передаётся в список шифров OpenSSL;tls-ciphersuitesвыбирает наборы TLS 1.3;tls-version-minиtls-version-maxограничивают версии протокола, которые соединение может использовать.
Поэтому аккуратно подрезанный список наборов TLS 1.3 ничего не доказывает о том, что старая версия всё ещё разрешена. Если требование — «только TLS 1.3», его несёт нижняя граница версии, а список наборов лишь сужает выбор внутри этой границы:
tls-version-min 1.3
tls-ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
Эта пара выполняет две задачи. Удаление одной из строк оставляет другую применять меньше, чем вы думаете, и именно этот сбой призвана ловить вся эта проверка.
Канал данных — четвёртый элемент управления. data-ciphers согласует симметричный шифр внутри туннеля, и его результат ничего не говорит о версии TLS канала управления. Видеть AES-256-GCM в сводке сессии не является доказательством TLS 1.3 ни в одну сторону.
Читайте show-tls как локальный инвентарь
--show-tls перечисляет наборы, поддерживаемые криптографической библиотекой, с которой слинкован этот бинарный файл, в порядке предпочтения. Это не отчёт от шлюза. Руководство прямо говорит, что список берётся из локальной библиотеки, а значит, ноутбук с OpenSSL 3.x и маршрутизатор со старой сборкой напечатают разные списки, разговаривая с одним и тем же сервером.
| Evidence | What it actually describes |
|---|---|
--show-tls output | Capabilities of this client build and its library |
| Profile directives | What this attempt is allowed to offer |
| Session log line | What this one negotiation selected |
Предположим, клиент поддерживает наборы A, B и C, и одна сессия выбирает B. Это ничего не устанавливает о том, разрешает ли сервер A или C, и ничего о том, является ли B единственным разрешённым выбором. Держите три строки раздельно, и большинство запутанных обсуждений TLS разрешатся сами.
Инвентарь всё же стоит сохранять. Когда сессия не удаётся, сравнение списка библиотеки со списком профиля показывает, была ли у клиента вообще возможность предложить то, что хотел сервер. Оно также показывает, не убрала ли смена backend молча TLS_CHACHA20_POLY1305_SHA256 из пула, на который полагаются старые клиенты, — тот вид регрессии, который проявляется как горстка пользователей, не могущих подключиться, тогда как все остальные ничего не замечают.
Спросите у шлюза то, на что он может ответить
Если вы администрируете сервис, проверяйте эффективную конфигурацию работающего экземпляра, а не файл на диске. OpenVPN мог быть запущен с другим путём --config, может подтягивать включаемые файлы и мог не перезапускаться после правки. Клиенты сталкиваются с политикой работающего демона.
Если вы им не администрируете, попросите оператора о поддерживаемых требованиях к клиентам или ограниченном приёмочном тесте. Отклонённая попытка — не обязательно отклонённый набор: нижняя граница версии, проверки идентичности сертификата вроде remote-cert-tls или несоответствие tls-auth и tls-crypt могут завершить обмен ещё до того, как выбор набора станет важен. Прочитайте ошибку сервера, прежде чем менять список клиента, потому что «handshake failed» охватывает четыре разные причины, и только одна из них — несовпадение шифра.
Направление openssl s_client на порт VPN тоже не воспроизводит вопрос. Канал управления работает внутри собственной рамки OpenVPN, поэтому сырой TLS-зонд проверяет другой протокол на порту, который ждёт чего-то иного. Любой вывод из него относится к зонду, а не к туннелю.
Запишите два результата и держите их раздельно
Свежая разрешённая сессия создаёт строку канала управления с указанием версии протокола и выбранного шифра, а также отдельную строку канала данных с указанием шифра туннеля. Зафиксируйте обе вместе с версией клиента и именем профиля и отметьте, какой экземпляр сервера ответил:
openvpn --config office.ovpn --verb 4 2>&1 | tee session.txt
Затем читайте эти две строки из того файла, а не из памяти. Пара — это доказательство; одно имя набора — предпочтение, а граница версии — отдельное утверждение о том, от чего сервер отказывается.
Выполняйте проверки в таком порядке. Подтвердите сборку и backend с помощью --version. Зафиксируйте --show-tls до любых изменений. Назовите требуемую нижнюю границу версии отдельно от списка наборов. Подтвердите эффективную политику работающего экземпляра у его владельца. Пронаблюдайте одну разрешённую сессию и, если план позволяет, одну отклонённую попытку со старой версией. Запишите результаты канала управления и канала данных как отдельные находки.
Если требуемый клиент не может выполнить новый минимум, примите это решение о миграции или исключении явно, вместо того чтобы тихо снижать несвязанное правило приёмки, чтобы развёртывание выглядело завершённым.