WSS թունելի գաղտնագրումը ավարտվում է TLS-ի վերջնակետում, ոչ թե հավելվածում
wss:// հասցեն ապացուցում է TLS-ի առկայությունը մեկ թռիչքում։ Արդյոք բեռն ունի իր սեփական գաղտնագրումը, կախված է նրանից, թե հաճախորդն ինչ է դնում ներսում և ով է ավարտում այդ TLS-ը։
Ապահով WebSocket-ի ներսում տեղափոխվող թունելն ունի ճիշտ այնքան գաղտնագրում, որքան հաճախորդը դրել է դրա մեջ, ոչ ավելին։ wss:// սխեման ասում է, որ TLS-ը պաշտպանում է մեկ կապ մեկ թռիչքում։ Այն ոչինչ չի ասում այն մասին, թե արդյոք WebSocket հաղորդագրությունների ներսում եղած բայթերը առանձին պաշտպանված են, և հենց այդ տարբերությունն է որոշում, թե ով կարող է կարդալ ձեր տրաֆիկը, երբ ինչ-որ բան մեջտեղում ավարտում է TLS-ը։
Երկու շերտ, որոնք մեկի տեսք ունեն
Ապահով WebSocket-ը TLS է, որի վրա կատարվում է WebSocket ձեռքսեղմում, ինչպես նկարագրում է RFC 6455-ը իր կապի և անվտանգության բաժիններում։ TLS շերտը նույնականացնում է սերվերը և գաղտնագրում հոսքը, ապա WebSocket շերտը շրջանակում է այն, ինչ հավելվածը որոշում է ուղարկել։
Դրանք երկու անկախ որոշումներ են, և ամբողջ ուղու վրա մեկ կողպեք նկարող դիագրամը թաքցնում է երկրորդը։ Հարցրեք, թե ով է ավարտում TLS կապը։ Հետո հարցրեք, թե ինչ է հաճախորդը դնում յուրաքանչյուր հաղորդագրության մեջ։ Տեղակայման մասին մնացած ամեն ինչ բխում է այս երկու պատասխաններից։
Դիզայն A. տրանսպորտը միակ գաղտնագրումն է
Ավելի պարզ դիզայնում հաճախորդը վերցնում է հում IP փաթեթներ և փաթաթում դրանք WebSocket հաղորդագրությունների մեջ։ Ներսում ոչինչ գաղտնագրված չէ, ուստի TLS սեսիան պահող բաղադրիչը կարդում է բաց տեքստով բեռեր։ Երբ այդ բաղադրիչը ձեր սեփական թունելի սերվերն է, սա նախատեսված վերջնակետն է, և դիզայնը համահունչ է, որովհետև սերվերը միևնույն է տեսնելու էր տրաֆիկը։
Սա դառնում է այլ դասավորություն, երբ ուղու վրա նստում է ստուգման պրոքսի և ավարտում TLS-ը հաճախորդի վստահած վկայականով։ Այդ պրոքսին այժմ պահում է նույն բաց տեքստը, որը պահելու էր սերվերը, և WebSocket շրջանակման ոչ մի քանակություն դա չի փոխում։ Հաճախորդի վստահության պահոցը որոշել է այս արդյունքը շատ ավելի վաղ, քան բացվել է թունելը, որովհետև այն ընտրել է ընդունել այդ վկայականը այդ անվան համար։ Պրոքսին նաև տեսնում է պահանջված հոսթը և յուրաքանչյուր հաղորդագրության չափը, ինչը բավական է շատ ակտիվության մատնահետք վերցնելու համար՝ առանց որևէ բան լրացուցիչ գաղտնազերծելու։
Դիզայն B. բեռը կրում է իր սեփական բանալիները
Երկրորդ դիզայնում հաճախորդը գաղտնագրում և նույնականացնում է իր փաթեթները VPN արձանագրությամբ, որն ունի իր սեփական գործընկերոջ ինքնությունը և բանալիների փոխանակում, ապա արդյունքը տեղափոխում WebSocket հաղորդագրությունների ներսում։ Արտաքին TLS-ի ավարտումը այստեղ բացահայտում է գաղտնագրված տեքստ, ոչ թե տրաֆիկ։ Պրոքսին կարող է տեսնել հաղորդագրությունների չափերն ու ժամանակը, և ոչ այլ բան բեռի մեջ։ Սա շատ ավելի փոքր ազդեցություն է, և այն դեռևս մետատվյալ է, որն արժե անվանել վերանայման ժամանակ, այլ ոչ թե մի կողմ հրել։
Ներքին արձանագրության սեփական վերջնակետերը դեռևս տեսնում են բաց տեքստ, ինչը դասավորության իմաստն է և նաև դրա սահմանը։ Եթե վերջնակետի բաղադրիչը լիազորված է տվյալներ կարդալ գաղտնագրումից առաջ կամ գաղտնազերծումից հետո, լրացուցիչ շերտը չի սահմանափակում այն։ Բանալիները և դրանք կառավարող ծրագրաշարը մնում են այն սահմանը, որն ունի նշանակություն։
VPN պիտակը, ծանոթ հաճախորդի պատկերակը կամ մարքեթինգային էջը ապացույց չեն, որ այս դիզայնը գոյություն ունի։ Բեռի ձևաչափը կարդալը ապացույց է։
Հետևեք, թե որտեղ է իրականում հայտնվում բաց տեքստը
URL սխեման ձեզ տալիս է մեկ փաստ, մնացածը վերցրեք ինտերֆեյսներից։ Գործարկեք ստորև նշված ստուգումները հերթականությամբ, որովհետև յուրաքանչյուրը նեղացնում է հաջորդը.
ss -tnp | grep -E ':(443|8443)\b' ip -br link show type tun openssl s_client -connect vpn.example.net:443 -servername vpn.example.net -brief tcpdump -ni tun0 -c 5 -X
Սկսեք արտաքին կապից։ TLS պորտին մեկ երկարատև TCP սեսիան այն է, ինչպիսին տեսք ունի WebSocket կրիչը, և անկապ հոսթին երկրորդ սեսիան արժանի է բացատրության՝ ավելի խորը նայելուց առաջ։ Հետո գտեք թունելի ինտերֆեյսը հաճախորդի վրա, որովհետև tun կամ tap սարքը ասում է, որ հաճախորդը զբաղվում է IP փաթեթներով, այլ ոչ թե պրոքսի է անում մեկ հավելվածային հոսք։
Թունելի ինտերֆեյսի վրա կատարված որսումը սովորաբար լուծում է բեռի հարցը։ Այնտեղ ընթեռնելի վերնագրերը նշանակում են, որ ներքին փաթեթները երբեք առանձին գաղտնագրված չեն եղել, մինչդեռ բարձր էնտրոպիայով բեռերը նշանակում են, որ եղել են։ Կրկնեք որսումը արտաքին ինտերֆեյսի վրա և համեմատեք երկուսը. եթե երկուսն էլ պատահական տեսք ունեն, ներքին շերտը կատարում է աշխատանք, որը արտաքինը չի կարող չեղարկել։
Վերանայեք այն վստահությունը, որը իրականում տվել եք
Տեղադրված կորպորատիվ արմատային վկայականը փաստ է հաճախորդի վստահության պահոցի մասին, ոչ թե հայտարարություն այն մասին, թե ինչ է գրանցում կամ ստուգում որևէ պրոքսի։ Սահմանեք տեղակայված քաղաքականությունը և իրական կապի ուղին, և ոչ թե եզրակացրեք վարքագիծը CA-ի առկայությունից։
Կառավարվող սարքավորումների վրա հարցրեք ադմինիստրատորին, թե որ բաղադրիչն է ավարտում TLS-ը, արդյոք հաճախորդը վավերացնում է ամրացված վկայական, թե հանրային, և որն է բեռի ձևաչափը։ Այս երեք պատասխանները տալիս են գտածո, որը կարող եք պաշտպանել ավելի ուշ։
Արդյունքը գրառեք որպես սահման, այլ ոչ թե դատավճիռ։ «TLS-ը ավարտվում է ստուգման պրոքսիի մոտ, և ներքին բեռը առանձին գաղտնագրված է բանալիներով, որոնք ունեն միայն վերջնակետերը» ստուգելի պնդում է, որը դիմանում է մատակարարի փոփոխությանը։ «WebSockets-ը ապահով են»՝ ոչ։