2010-04-23 37 views
5

Mam bardzo podstawowe wątpliwości w SSL HandShake. Załóżmy, że mamy serwer S, który używa certyfikatów samopodpisanych. Piszę klienta Java C, który łączy się z S. Gdy C łączy się z S, C pobiera certyfikaty z S i zapisuje je do swojego magazynu zaufanych certyfikatów, a pozostała część komunikacji przebiega dalej. Po pewnym czasie używam tego samego C, aby połączyć się z S, więc S ponownie wyśle ​​certyfikaty do C, lub C użyje certyfikatów już przechowywanych w zaufanym magazynie. Nie jestem dobry w SSL i podstawowym wdrażaniu funkcjonalności Truststore w Javie.SSL HandShake na kliencie Java

Czy S będzie wysyłać certyfikaty do C niezmiennie, czy C ma certyfikaty w swoim zaufanym magazynie? Wierzę, że jeśli mam certyfikaty w zaufanym magazynie C, czy S i C nie będą prosić o certyfikaty, gdy ponownie się połączę? Czy moje założenie ma rację?

Czy proces jest taki sam dla certyfikatów z podpisem własnym i certyfikatów CA?

Z góry dziękuję.

+1

Napisałem symulator https w języku Java. Udało mi się symulować 12000-15000 próśb w 15 sekund przy użyciu certyfikatów z podpisem własnym. Ale zajmuje 3 minuty przy użyciu certyfikatów CA? Naprawdę nie rozumiem, dlaczego tak się dzieje. Czy jest jakaś subtelna różnica w obsłudze autopodpisanych certyfikatów kontra CA? – JKV

Odpowiedz

6

To jest moje zrozumienie SSL, nie jestem ekspertem w temacie, ale pod nieobecność innych odpowiedzi mam nadzieję, że przynajmniej dam ci kilka rzeczy do przemyślenia.

Gdy tworzysz samopodpisany certyfikat dla serwera, musisz jakoś dodać to do klienta, nie zostanie on zainstalowany zaraz po nawiązaniu połączenia z klientem, w przeciwnym razie serwer może zostać zaufany, wysyłając samopodpisany certyfikat do wszystkiego, co próbuje się z nim połączyć. W mojej aplikacji certyfikat serwera jest ładowany do magazynu zaufanych certyfikatów klienta po uruchomieniu, określając javax.net.ssl.truststore ("path/to/server/cert");

Teraz, gdy klient łączy się z serwerem, odbywa się uzgadnianie. W tym momencie serwer wyśle ​​certyfikat do klienta, a klient potwierdzi, że faktycznie pochodzi z serwera, sprawdzając go w swoim magazynie zaufanych certyfikatów (w tym momencie nie ma znaczenia, czy jest on samopodpisany, czy nie, ponieważ klient powinien sprawdzić certyfikaty główne, a także wszystkie dodane przez ciebie). Jeśli certyfikat wysłany przez serwer sprawdza, czy komunikacja jest kontynuowana i dane są współużytkowane.

Istnieje pewna forma zachowania sesji, która pozwala na kontynuowanie komunikacji bez konieczności wymiany certyfikatów za każdym razem. Sądzę jednak, że ogranicza się to do pojedynczego połączenia, więc gdy tylko zamkniesz połączenie i utworzysz nowe, proces musi zostać powtórzony, tzn. Serwer musi ponownie wysłać swój certyfikat do sprawdzania poprawności.

Podsumowując: certyfikat serwera z podpisem własnym musi zostać zainstalowany na kliencie poza komunikacją SSL (np. Jak instalowane są certyfikaty głównego CA w produkcie od samego początku). Każde połączenie SSL między klientem a serwerem będzie wymagać od serwera wysłania certyfikatu do klienta, aby mógł go sprawdzić w swoim magazynie zaufanych certyfikatów.

Jest możliwe, że serwer pozwoli na wznowienie sesji, w takim przypadku certyfikat nie zostanie ponownie wysłany (ale nie jestem pewien, w jakich warunkach można wznowić sesję, być może jest to konfigurowalne na różnych serwerach) .

Mam nadzieję, że to przynajmniej daje ci do myślenia.

+0

To całkiem nieźle.Możliwość wznowienia nie jest powiązana z połączeniami; Zwykle jest to po prostu kwestia sesji o pewnym czasie życia, zwykle pięć minut, podczas której nowe połączenia SSL między tymi samymi partnerami SSL mogą ponownie wykorzystać sekret główny wygenerowany na początku. –

+0

Napisałem symulator https w języku Java. Udało mi się symulować 12000-15000 próśb w 15 sekund przy użyciu certyfikatów z podpisem własnym. Ale zajmuje 3 minuty przy użyciu certyfikatów CA? Naprawdę nie rozumiem, dlaczego tak się dzieje. Czy jest jakaś subtelna różnica w obsłudze autopodpisanych certyfikatów kontra CA? – JKV

+1

Nie sądzę, że istnieją jakiekolwiek różnice w sposobie ich obsługi, ale mogą być różnice w samych certyfikatach. Być może kluczowy rozmiar używany w certyfikacie z podpisem własnym jest krótszy niż certyfikaty CA? Certyfikaty urzędów certyfikacji mogą mieć długi łańcuch certyfikatów, więc aby zweryfikować certyfikat klienta, musi on przeglądać dłuższą listę zaufanych certyfikatów. Są sposoby patrzenia na te rzeczy za pomocą openssl, jak sądzę. – DaveJohnston

Powiązane problemy