tls-auth key-direction: 0 и 1 трябва да се различават, а не да съвпадат
При tls-auth двете страни се нуждаят от противоположни посоки, 0 и 1, или и двете трябва да пропуснат настройката. Едно и също число се проваля, а tls-crypt никога не го използва.
Едната страна на тунела подписва контролния канал с ключов слот, който другата страна никога не проверява, и връзката умира с грешка при удостоверяване още преди да е разменен дори един сертификат. Така изглежда несъответствието на посоката при tls-auth и то е детерминистично: същите два файла се провалят при всеки опит, от всяка мрежа. Нищо в журнала не назовава опцията, която търсите, затова хората пресъздават ключове и преиздават сертификати, които никога не са били счупени. Решението е да направите двете страни допълващи се или да оставите и двете двупосочни, вместо да отслабвате проверката.
Провалът настъпва преди сертификатите
При tls-auth двете страни държат един и същ споделен ключ и всяка използва един от два слота, извлечени от него: единият слот подписва изходящите контролни пакети, другият проверява входящите. Посока 0 и посока 1 задават тези роли в обратен ред, така че двойката трябва да е допълваща, за да съвпаднат HMAC проверките. Когато назначението е обърнато от една страна, получателят търси подпис в грешния слот и отхвърля пакета. Сесията приключва там, затова грешката засяга удостоверяването на пакети, а не нещо, което хранилището на сертификати би създало.
Детерминизмът е важен за диагностиката, защото проблем с времето или пътя оставя различен отпечатък: прекъсващи сривове, провал в една посока или сесия, която умира само в определена мрежа. Несъответствието на посоката се проваля при първото ръкостискане всеки път и се проваля по идентичен начин на друга машина със същите два файла. Четете журнала при --verb 4 и намерете първия отхвърлен пакет, а не последния ред. Ако това отхвърляне се случва преди каквато и да е размяна на сертификати, споделеният ключ и неговата посока са двете неща, които си струва да проверите.
| What you see | What it rules out | Next check |
|---|---|---|
| Authentication error before any certificate is sent | The data channel is irrelevant; the control channel never authenticated | Compare tls-auth and its direction on both ends |
| Certificate or handshake failure after the control channel authenticates | The shared key and its direction already agree | Check the CA, the certificate dates and the hostname |
| Session completes but throughput or cipher warnings appear | Direction was never the problem | Compare the data-channel cipher settings |
| Startup stops on an options error | The number itself is not the issue | Re-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'
Рестартирайте двете страни след всяка промяна, защото тези опции се четат веднъж при стартиране и презареждането на едната страна оставя двойката несъгласувана за целия живот на старата сесия. Ако внедряването в момента работи без зададена посока, добавянето на настройката на едната страна възпроизвежда провала, с който сте започнали; или оставете и двете, или конфигурирайте и двете. Променяйте един край наведнъж и пазете предишния файл, така че регресията да е двуминутно връщане, а не преустройство.
Запишете механизма, ключовия файл и посоката за всеки край в бележките за внедряване, защото иначе следващият човек ще прочете два подобни файла и ще предположи, че числата трябва да съвпадат едно с друго. Посоката е координационен детайл, а не подобрение на сигурността: тя разделя двете посоки на контролния канал и не прави нищо друго.