Uwierzytelnianie WebSockets

Jakie są możliwe sposoby uwierzytelniania użytkownika przy użyciu połączenia websocket?

Przykładowy scenariusz: internetowa aplikacja do czatu dla wielu użytkowników poprzez szyfrowane połączenie websocket. W jaki sposób mogę zapewnić (lub zagwarantować), że każde połączenie w tej aplikacji należy do pewnego uwierzytelnionego użytkownika i "nie może być" wykorzystane przez fałszywe podszywanie się pod użytkownika podczas połączenia.

Author: yojimbo87, 2010-04-23

3 answers

SSL / TLS może być używany do uwierzytelniania zarówno Klienta, jak i serwera przy użyciu certyfikatów X. 509. To zależy od platformy aplikacji internetowej, z której korzystasz. W apache zmienna środowiskowa SSL_CLIENT_CERT może być sprawdzana pod kątem ważności względem listy znanych certyfikatów, które mają być ważne. Nie wymagałoby to użycia pełnego PKI i nie wymagałoby zakupu certyfikatów dla każdego klienta. Chociaż zalecam używanie urzędu certyfikacji do wspierania certyfikatu ssl serwera.

 3
Author: rook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-23 19:43:03

Jeśli wykonujesz już uwierzytelnianie dla części aplikacji innej niż websocket, po prostu przekaż plik cookie sesji jako pierwszą wiadomość po połączeniu i sprawdź plik cookie tak, jak zwykle.

Uwaga: zauważono, że następujące elementy nie działają przy użyciu flashsockets:
Jeśli używasz socket.io , jest to jeszcze łatwiejsze-pliki cookie są przekazywane automatycznie po połączeniu i mogą być dostępne w następujący sposób:

var io = require('socket.io');
var socket = io.listen(app); 
socket.on('connection', function(client){ 
    cookies = client.headers['cookie'];
});
 42
Author: Derek Dahmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-26 16:13:37

Są dwa sposoby.

Jednym ze sposobów jest umożliwienie każdemu otwarcia połączenia z Internetem. Zleć klientowi wysłanie tokena autoryzacji jako pierwszej wiadomości po otwarciu połączenia. Jeśli klient nie wyśle ważnego tokena w określonym czasie, zamknij połączenie.

Innym sposobem jest użycie plików cookie (są one wysyłane automatycznie przez przeglądarkę na każde żądanie). Wymaga to wdrożenia ochrony CSRF (nawet bardziej niż zwykle, ponieważ nie ma takiej samej polityki pochodzenia (SOP) dla websockets. Szczegóły znajdziesz tutaj . Zarys jest następujący:

    W przeciwieństwie do js, WebSocket preauth nie może być używany do tworzenia stron internetowych.]}
  1. backend zwraca token CSRF w treści odpowiedzi i ustawia plik cookie "websocket auth" z SameSite=Strict w nagłówkach odpowiedzi
  2. W przeciwieństwie do innych systemów, które nie są w pełni kompatybilne z serwerem, nie są w pełni kompatybilne z serwerem.]}
  3. Kontrola zaplecza
    • że websocket AUTH cookie i token CSRF są ważne
    • że wartość nagłówka Origin pasuje do zatwierdzonej domeny
  4. [11]}backend wysyła odpowiedź i aktualizuje połączenie, aby używać websockets

Pierwsza metoda jest prostsza, ale ma tę wadę, że wymaga posiadania jakiegoś stanu po stronie serwera czekającego na uwierzytelnienie klienta. Może to umożliwić atakującemu wykonanie ataku typu odmowa usługi poprzez wykorzystanie wszystkich dostępnych gniazd.

 0
Author: kag0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-22 00:17:42