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.
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