Trudno jest porównać SSL/TLS i SASL, ponieważ SSL/TLS to protokół komunikacyjny, natomiast SASL to framework, zintegrowany z innymi protokołami. (W rzeczywistości, możesz użyć obu jednocześnie w pewnych okolicznościach.)
Poza tym wspomniałeś o protokole Kerberos, który jest rzeczywiście protokołem uwierzytelniania (który może być używany z SSL/TLS lub SASL lub niezależnie zarówno). Wydaje się, że Twoje pytanie sugeruje, czy używać Kerberos jako jednego z głównych problemów podrzędnych, które powinieneś wybrać jako pierwsze.
SASL jest zasadniczo warstwą pośrednią, umożliwiającą wtykowe systemy uwierzytelniania i bezpieczeństwo danych w istniejących protokołach aplikacji (np. LDAP, SMTP, Subversion, ...), chociaż protokoły te muszą być świadome tego rozszerzenia (np. SMTP auth) . To, czy i jak zapewnia bezpieczne uwierzytelnianie i szyfrowanie danych, zależy w dużej mierze od tego, co jest używane w tym środowisku. Oto przykład z svnserve
documentation: "Wbudowany mechanizm CRAM-MD5 nie obsługuje szyfrowania, ale DIGEST-MD5 ma". Jeśli chcesz używać protokołu Kerberos z SASL, będziesz potrzebował innego poziomu niezależności: GSS-API (który jest najczęściej używany z Kerberos, ale może również zezwalać na inne mechanizmy). (Zauważ, że GSSAPI
w kontekście SASL zdaje się sugerować, Kerberos i tak, w przeciwieństwie do swoich GS2
successor.)
Ogólnym celem jest SSL/TLS, aby zabezpieczyć komunikację (integralność i poufność) pomiędzy klientem a serwerem. Klient powinien zawsze sprawdzać tożsamość serwera SSL/TLS i zapewnia mechanizmy sprawdzania tożsamości klienta przez serwer. To, co może zrobić, zależy również od sposobu jego skonfigurowania. SSL/TLS jest najczęściej używany z certyfikatami X.509: w ten sposób przeglądarka może sprawdzić tożsamość serwera HTTPS. Serwery można również skonfigurować tak, aby żądały od klienta korzystania z certyfikatu w celu identyfikacji (uwierzytelnianie za pomocą certyfikatu klienta). Jeśli jednak chcesz używać protokołu Kerberos, możesz użyć TLS Kerberos cipher suites. Jest to znacznie mniej powszechne, ale są one implemented in the JSSE.
Jego implementacje zwykle zapewniają interfejsy API podobne do tych, które uzyskuje się dzięki zwykłym połączeniom TCP: w języku Java, po skonfigurowaniu, można w mniejszym lub większym stopniu użyć wartości SSLSocket
, tak jak w przypadku zwykłego Socket
. Nie wymaga to szczególnej świadomości przez protokół znajdujący się na górze gniazda, chociaż niektóre protokoły mają jawne polecenia przełączania się na SSL/TLS z połączenia zwykłego (Implicit v.s. Explicit SSL/TLS). Może również zapewnić uwierzytelnianie. W Javie JSSE jest domyślną implementacją SSL/TLS, która daje dostęp do SSLSocket
(lub SSLEngine
, jeśli jesteś wystarczająco odważny).
Czasami warto czytać „When to use Java GSS-API vs. JSSE”, który jest podobny do „SASL vs. SSL/TLS” (chociaż nie wydaje się, aby zostały zaktualizowane przez jakiś czas, ponieważ JSSE robi wsparcia Kerberos szyfrów teraz, przynajmniej od Oracle Java 6).
Przyznam, że wiem mniej o SASL niż o SSL/TLS, ale szyfrowanie danych za pośrednictwem SASL brzmi, jakby to było więcej pracy. Wygląda na to, że nie ma pewnych funkcji SSL/TLS, takich jak Perfect Forward Secrecy offered by EDH cipher suites. Istnieje example that uses SASL with GSSAPI (Kerberos here) in the JGSS tutorial: musisz zawijać/rozwijać dane jawnie, czego nie musiałbyś robić, gdy używasz SSLSocket
s.
Myślę, że należy przede wszystkim zdecydować, który mechanizm uwierzytelniania ma zostać użyty: Kerberos, certyfikaty X.509 lub coś innego. Będzie to miało większy wpływ na twoją ogólną architekturę, a oba mogą być używane z SASL i SSL/TLS (bardziej, jeśli użyjesz SASL z mechanizmem EXTERNAL
, gdy będziesz na szczycie połączenia SSL/TLS).
- Kerberos jest bardzo scentralizowany. Klient musi mieć możliwość skontaktowania się z KDC w celu uwierzytelnienia, oprócz możliwości skontaktowania się z serwerem aplikacji. Klienci będą również musieli być skonfigurowani do korzystania z tego KDC. Z punktu widzenia użytkownika mogą używać haseł.
- X.509 jest bardziej zdecentralizowany. Jednak może być konieczne wdrożenie urzędu certyfikacji (lub użycia komercyjnego) dla certyfikatów użytkownika. Użytkownicy będą musieli otrzymać certyfikaty i klucze prywatne, które mogą być dla niektórych zbyt skomplikowane.
JAAS wchodzi w to, ponieważ jest to ogólne środowisko Java do obsługi uwierzytelniania i autoryzacji. Jest ściśle powiązany z pojęciem menedżerów bezpieczeństwa. To daje pojęcie Subject
and Principal
. Nie jest to bezpośrednio związane z protokołami ani komunikacją, ale raczej ze sposobem modelowania uwierzytelniania i autoryzacji w aplikacji. (Daje ci standardowy zestaw klas, aby to zrobić.)
(Generalnie proponuję przejść przez Java reference documents, które wspominają o słowach, których szukasz: JGSS, SASL, ..., chociaż są niekoniecznie łatwe do odczytania.)
Warstwa uwierzytelniania i bezpieczna warstwa transportowa to właściwie coś zupełnie innego, choć oba mogą być używane do uwierzytelniania. Ale jeśli zadasz to pytanie, zastanawiam się, czy szukasz problemu do rozwiązania, czy też próbujesz rozwiązać problem. –
Próbuję dowiedzieć się, czy mój klient Java i serwer muszą używać SSL lub SASL do ochrony danych użytkownika/żądań/odpowiedzi, gdy komunikują się ze sobą, więc to byłaby druga (próbując rozwiązać problem). – IAmYourFaja