Przeczytałem mnóstwo dokumentacji związanej z tym problemem, ale nadal nie mogę zebrać wszystkich elementów razem, więc chciałbym zadać kilka pytań.
Przede wszystkim opiszę pokrótce procedurę uwierzytelniania, tak jak ją rozumiem, ponieważ mogę się w tym zakresie pomylić: Klient rozpoczyna połączenie, na które serwer odpowiada kombinacją klucza publicznego, metadanych i podpisu cyfrowego zaufany organ. Następnie klient podejmuje decyzję, czy ufa serwerowi, szyfruje jakiś losowy klucz sesji kluczem publicznym i odsyła go. Ten klucz sesji można odszyfrować tylko za pomocą klucza prywatnego przechowywanego na serwerze. Serwer robi to, a następnie rozpoczyna się sesja HTTPS.
Tak więc, jeśli mam rację powyżej, pytanie brzmi, jak atak man-in-the-middle może wystąpić w takim scenariuszu? Chodzi mi o to, że nawet jeśli ktoś przechwyci odpowiedź serwera (np. Www.server.com) kluczem publicznym i ma jakieś środki, aby pomyśleć, że jest on www.server.com, nadal nie byłby w stanie odszyfrować mojego klucza sesji bez klucza prywatnego.
Mówiąc o wzajemnym uwierzytelnianiu, czy chodzi o zaufanie serwera do tożsamości klienta? To znaczy klient może już być pewien, że komunikuje się z odpowiednim serwerem, ale teraz serwer chce się dowiedzieć, kim jest klient, prawda?
I ostatnie pytanie dotyczy alternatywy dla wzajemnego uwierzytelniania. Jeśli w opisanej sytuacji występuję jako klient, co jeśli wyślę login / hasło w nagłówku HTTP po nawiązaniu sesji SSL? Z mojego punktu widzenia ta informacja nie może zostać przechwycona, ponieważ połączenie jest już zabezpieczone i serwer może na nich polegać w celu mojej identyfikacji. Czy się mylę? Jakie są wady takiego podejścia w porównaniu z uwierzytelnianiem wzajemnym (ważne są tylko kwestie bezpieczeństwa, a nie złożoność implementacji)?