Едната страна на тунела подписва контролния канал с ключов слот, който другата страна никога не проверява, и връзката умира с грешка при удостоверяване още преди да е разменен дори един сертификат. Така изглежда несъответствието на посоката при tls-auth и то е детерминистично: същите два файла се провалят при всеки опит, от всяка мрежа. Нищо в журнала не назовава опцията, която търсите, затова хората пресъздават ключове и преиздават сертификати, които никога не са били счупени. Решението е да направите двете страни допълващи се или да оставите и двете двупосочни, вместо да отслабвате проверката.

Провалът настъпва преди сертификатите

При tls-auth двете страни държат един и същ споделен ключ и всяка използва един от два слота, извлечени от него: единият слот подписва изходящите контролни пакети, другият проверява входящите. Посока 0 и посока 1 задават тези роли в обратен ред, така че двойката трябва да е допълваща, за да съвпаднат HMAC проверките. Когато назначението е обърнато от една страна, получателят търси подпис в грешния слот и отхвърля пакета. Сесията приключва там, затова грешката засяга удостоверяването на пакети, а не нещо, което хранилището на сертификати би създало.

Детерминизмът е важен за диагностиката, защото проблем с времето или пътя оставя различен отпечатък: прекъсващи сривове, провал в една посока или сесия, която умира само в определена мрежа. Несъответствието на посоката се проваля при първото ръкостискане всеки път и се проваля по идентичен начин на друга машина със същите два файла. Четете журнала при --verb 4 и намерете първия отхвърлен пакет, а не последния ред. Ако това отхвърляне се случва преди каквато и да е размяна на сертификати, споделеният ключ и неговата посока са двете неща, които си струва да проверите.

What you seeWhat it rules outNext check
Authentication error before any certificate is sentThe data channel is irrelevant; the control channel never authenticatedCompare tls-auth and its direction on both ends
Certificate or handshake failure after the control channel authenticatesThe shared key and its direction already agreeCheck the CA, the certificate dates and the hostname
Session completes but throughput or cipher warnings appearDirection was never the problemCompare the data-channel cipher settings
Startup stops on an options errorThe number itself is not the issueRe-read the inline versus external directive syntax

Къде живее числото

Ръководството OpenVPN 2.6 документира две места за посоката: вторият аргумент на tls-auth, когато ключът е в отделен файл, и самостоятелен ред key-direction, когато ключът е вграден в профила. И двете задават една и съща стойност, затова профилът трябва да използва едната форма или другата, никога и двете. Пропускането също е избор и поставя двете страни в двупосочно разположение, което работи, когато нито една страна не назовава посока. Две страни с едно и също число не са в такова разположение: всяка очаква да подписва в един слот и да проверява в другия, и двете го правят по същия начин.

# server.conf, external key
tls-auth ta.key 0

# client.ovpn, external key
tls-auth ta.key 1

# client.ovpn, inline key
key-direction 1

Вградената форма е директива на самостоятелен ред, а не атрибут на отварящия таг на ключовия блок, и добавянето на аргумент към този таг е грешка, а не промяна на посоката. Разположението също има значение: директивата стои извън блока, към който принадлежи, затова стойност, написана вътре в блока, се чете като ключов материал. Копирайте разположението, което разпространителят на профила е имал предвид, вместо да измисляте двойка, защото профил, който работи срещу един сървър, може вече да е огледален от другата страна.

Какво опцията оставя непокътнато

Тя не криптира трафика на приложенията. tls-auth поставя HMAC около пакетите на контролния канал, докато каналът за данни е защитен от сесийни ключове, договорени при ръкостискането, така че въпрос за пропускливостта или шифъра няма нищо общо с числото на посоката. Настройката също не добавя втори слой криптиране и именно това предположение кара хората да търсят по-дълъг ключ.

Тя не се отнася за tls-crypt, различен механизъм за контролния канал със свои опции и работа с ключове, и не казва нищо за идентичността на сертификата на която и да е страна. Затова работещо съвпадение на посоката доказва само, че двете страни са съгласни как да удостоверяват контролния канал, а не че веригата на доверие е била валидирана.

Подравнете двойката, после се свържете отново

Сравнете двете конфигурации, преди да промените която и да е, защото редактирането на страната, която вече е била правилна, удвоява работата. Grep по-долу показва кой механизъм избира всеки файл; подробното изпълнение показва дали контролният канал изобщо се е удостоверил. Запазете и двата изхода, за да може следващата промяна да се сравни с известно състояние.

grep -n -E 'tls-auth|tls-crypt|key-direction' server.conf client.ovpn
openvpn --config client.ovpn --verb 4 2>&1 | grep -i -E 'hmac|tls error|control channel'

Рестартирайте двете страни след всяка промяна, защото тези опции се четат веднъж при стартиране и презареждането на едната страна оставя двойката несъгласувана за целия живот на старата сесия. Ако внедряването в момента работи без зададена посока, добавянето на настройката на едната страна възпроизвежда провала, с който сте започнали; или оставете и двете, или конфигурирайте и двете. Променяйте един край наведнъж и пазете предишния файл, така че регресията да е двуминутно връщане, а не преустройство.

Запишете механизма, ключовия файл и посоката за всеки край в бележките за внедряване, защото иначе следващият човек ще прочете два подобни файла и ще предположи, че числата трябва да съвпадат едно с друго. Посоката е координационен детайл, а не подобрение на сигурността: тя разделя двете посоки на контролния канал и не прави нищо друго.

Подобни статии