Wymiana klucza TLS a certyfikat klienta: co się loguje?
Oddziel uzgodnienie klucza od uwierzytelnienia klienta i tożsamości aplikacji, a następnie odczytaj komunikaty uścisku dłoni, które pokazują, czego połączenie naprawdę użyło.
Przenoszenie publicznej wartości wymiany klucza w uścisku dłoni nie jest tym samym zdarzeniem co logowanie klienta. Jedno ustanawia stan kryptograficzny połączenia; drugie mówi, kim jest klient, i zdarza się tylko wtedy, gdy serwer o to poprosi, a wymiana to obsłuży. Branie pierwszego za drugie prowadzi do błędnych wniosków o tym, co VPN ukrywa, a czego nie. Przeczytaj komunikaty, a potem zdecyduj, którą z czterech właściwości faktycznie zaobserwowałeś.
Dwa obiekty, które w przechwyceniu wyglądają tak samo
Klient TLS 1.3 może wnieść materiał wymiany klucza w swoim pierwszym locie, nie przedstawiając żadnego certyfikatu. Ten wkład jest jawny z założenia, bo serwer potrzebuje go do wyprowadzenia wspólnego sekretu. Certyfikat klienta to inny komunikat i jest wysyłany dopiero po tym, jak serwer o niego poprosi. Niesie tożsamość, którą serwer następnie weryfikuje, a uwierzytelnienie wzajemne jest decyzją serwera, nie właściwością wynikającą z zestawu szyfrów. Tożsamość aplikacji to rzecz całkiem trzecia: formularz logowania, token bearer, plik cookie. Nic z tego nie pojawia się w uścisku dłoni, a wszystko to przetrwa zmianę ścieżki sieciowej.
| Object in play | What it establishes |
|---|---|
| Key-exchange share | Cryptographic state for this connection |
| Server certificate | Which server the client reached |
| Client certificate | Client authentication, when requested |
| Application session | Account identity inside the application |
Cztery wiersze są niezależne. Połączenie może mieć wiersz pierwszy i drugi, pominąć trzeci, a i tak nieść czwarty w nagłówku cookie.
Zdecyduj, co może udowodnić przechwycony uścisk dłoni
Z samego uścisku dłoni obserwator poznaje wynegocjowaną wersję, zestaw szyfrów, certyfikat serwera i publiczne wartości wymiany klucza. To wystarcza, by pobrać odcisk implementacji klienta i zobaczyć, z którym serwerem się połączono. Czego to nie daje, to stanu prywatnego potrzebnego do odszyfrowania połączenia, którego tajność opiera się na wymianie efemerycznej, a nie na części publicznej. Nie daje też tożsamości konta, której od początku nie było w uścisku dłoni.
Uczciwy wniosek jest więc wąski: w tej wymianie nie przedstawiono żadnego certyfikatu klienta. Nie chodzi o to, że klient nie wysłał niczego, co da się powiązać, i z pewnością nie o to, że sesja nie niosła żadnego identyfikatora.
Czytaj komunikaty, nie nazwę szyfru
Zapytaj serwer, o co prosi, zamiast wnioskować z zestawu szyfrów. Uścisk dłoni TLS 1.3 z żądaniem certyfikatu jest widoczny w zapisie, a jego brak jest równie widoczny.
openssl s_client -connect app.example.net:443 -tls1_3 -msg < /dev/null 2>&1 | grep -i -E 'key_share|CertificateRequest'
Następnie powtórz ze skonfigurowanym certyfikatem klienta i porównaj. Drugie uruchomienie powinno pokazać, że certyfikat jest wysyłany i akceptowany; pierwsze nie powinno pokazać żadnego, i to jest konkretna różnica, o którą chodzi.
openssl s_client -connect app.example.net:443 -tls1_3 -cert client.pem -key client.key -quiet
Jeśli potrzebujesz tylko zwykłego przypadku przeglądania, szczegółowe wyjście klienta wystarczy, by zobaczyć wersję protokołu, wynik weryfikacji i to, czy zaproponowano certyfikat klienta. Serwer, który nigdy nie wysyła żądania certyfikatu, nie mógł go otrzymać.
Gdzie wznowienie zmienia odpowiedź
Wznowienie w TLS 1.3 korzysta z biletów powiązanych z tajnym stanem, więc późniejsze połączenie może zakończyć się bez pełnej wymiany certyfikatów. To zmniejsza to, co widzi obserwator, i zmienia to, co dowodzi zapis. Nie tworzy tożsamości tam, gdzie jej nie było. Wznowiona sesja nadal należy do tej samej sesji aplikacji, a każdy plik cookie lub token w tej sesji pozostaje identyfikatorem, który ma znaczenie.
Dlatego przegląd prywatności, który zatrzymuje się na „brak certyfikatu klienta”, pomija ciekawą część. Pytanie brzmi, która strona ma stabilny identyfikator, a nie którego komunikatu zabrakło w jednym uścisku dłoni.
Zapisz cztery właściwości, nie jeden wyrok
Zapisz uzgodnienie klucza, weryfikację serwera, uwierzytelnienie klienta i tożsamość aplikacji jako cztery osobne wiersze, z dowodem dla każdego. Ten spis przetrwa zmiany wersji protokołu i czyni argument o prywatności sprawdzalnym przez kogoś innego. Następnie dodaj, co wnosi ścieżka sieciowa. VPN zmienia adres źródłowy, który widzi usługa; nie usuwa logowania, pliku cookie ani odcisku urządzenia, które aplikacja już ma.
Zapisz razem wynegocjowaną wersję połączenia i wynik żądania certyfikatu, bo właśnie tej pary potrzebuje recenzent, by odtworzyć twój wniosek bez własnego przechwycenia.