Rozumiem, że magazyn kluczy zwykle przechowuje klucze prywatne / publiczne, a magazyn zaufania przechowuje tylko klucze publiczne (i reprezentuje listę zaufanych stron, z którymi zamierzasz się komunikować). Cóż, to moje pierwsze założenie, więc jeśli to nie jest poprawne, prawdopodobnie nie zacząłem zbyt dobrze ...
Byłem zainteresowany zrozumieniem, jak / kiedy rozróżniasz sklepy podczas korzystania z keytool.
Do tej pory stworzyłem magazyn kluczy
keytool -import -alias bob -file bob.crt -keystore keystore.ks
który tworzy mój plik keystore.ks. Odpowiadam yes
na pytanie: czy ufam bobowi, ale nie jest dla mnie jasne, czy utworzyło to plik kluczy lub plik zaufanych certyfikatów? Mogę skonfigurować moją aplikację do używania tego pliku jako jednego z nich.
-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x
i z System.setProperty( "javax.net.debug", "ssl")
ustawieniu widzę certyfikat pod zaufanymi certyfikatami (ale nie pod sekcją magazynu kluczy). Konkretny certyfikat, który importuję, ma tylko klucz publiczny i zamierzam go użyć do wysyłania danych przez połączenie SSL do Boba (ale być może najlepiej zostawić to na inne pytanie!).
Wszelkie wskazówki lub wyjaśnienia byłyby bardzo mile widziane. Czy dane wyjściowe keytool są takie same, niezależnie od tego, co importujesz, i jest to zwyczajna konwencja, która mówi, że jeden to magazyn kluczy, a drugi sklep zaufania? Jaki jest związek podczas korzystania z SSL itp.?
Odpowiedzi:
Terminologia jest nieco mylące, rzeczywiście, ale zarówno
javax.net.ssl.keyStore
ijavax.net.ssl.trustStore
są stosowane w celu określenia, które magazynów kluczy do użytku, dla dwóch różnych celów. Magazyny kluczy są dostępne w różnych formatach i niekoniecznie są plikami (patrz to pytanie ) ikeytool
są tylko narzędziem do wykonywania różnych operacji na nich (import / eksport / lista / ...).javax.net.ssl.keyStore
Ijavax.net.ssl.trustStore
parametry są domyślne parametry wykorzystywane do budowaniaKeyManager
s iTrustManager
s (odpowiednio), a następnie wykorzystywane do budowySSLContext
, która zasadniczo zawiera SSL / TLS ustawienia do wykorzystania przy podejmowaniu SSL / TLS poprzez połączenieSSLSocketFactory
lubSSLEngine
. Te właściwości systemowe są dokładnie tym, skąd pochodzą wartości domyślne, z których następnie korzystaSSLContext.getDefault()
sam,SSLSocketFactory.getDefault()
na przykład. (Wszystko to można dostosować za pomocą interfejsu API w wielu miejscach, jeśli nie chcesz używać wartości domyślnych i tych konkretnychSSLContext
dla określonego celu.)Różnica między
KeyManager
iTrustManager
(a więc międzyjavax.net.ssl.keyStore
ijavax.net.ssl.trustStore
) jest następująca (cytowana z przewodnika referencyjnego JSSE ):(Inne parametry są dostępne, a ich wartości domyślne są opisane w przewodniku dotyczącym referencji JSSE . Należy pamiętać, że chociaż istnieje wartość domyślna dla magazynu zaufanych certyfikatów, nie istnieje ona dla magazynu kluczy.)
Zasadniczo magazyn kluczy
javax.net.ssl.keyStore
ma zawierać twoje prywatne klucze i certyfikaty, podczas gdyjavax.net.ssl.trustStore
powinien zawierać certyfikaty CA, którym możesz zaufać, gdy strona zdalna przedstawi swój certyfikat. W niektórych przypadkach mogą być jednym i tym samym sklepem, chociaż często lepiej jest używać oddzielnych sklepów (zwłaszcza gdy są oparte na plikach).źródło
$JAVA_HOME/lib/security/cacerts
(patrz 2. przesłany link referencyjny JSSE). Podobnie jak przeglądarki, zawiera domyślny zestaw zaufanych certyfikatów CA. Zasadniczo klient zawsze używa magazynu zaufanych certyfikatów do sprawdzania certyfikatu serwera, ale magazyn kluczy będzie używany tylko wtedy, gdy serwer zażąda certyfikatu klienta, a serwer zawsze użyje magazynu kluczy dla własnego klucza + certyfikatu, ale magazyn zaufanych certyfikatów będzie tylko używane, jeśli klient wysyła certyfikat klienta.Aby wyjaśnić w typowy sposób użycia / celu lub laika:
Podczas uzgadniania protokołu SSL
Klient próbuje uzyskać dostęp do https: //
W ten sposób serwer odpowiada, podając certyfikat SSL (który jest przechowywany w magazynie kluczy)
Teraz klient otrzymuje certyfikat SSL i weryfikuje go za pomocą trustStore (tj. TrustStore klienta ma już zdefiniowany zestaw certyfikatów, którym ufa). To jak: Czy mogę zaufać temu serwerowi? Czy to ten sam serwer, z którym próbuję rozmawiać? Żadnych ataków średniego człowieka?
Raz klient sprawdza, czy rozmawia z serwerem, któremu ufa, a następnie komunikacja SSL może odbywać się za pośrednictwem wspólnego tajnego klucza.
Uwaga: nie mówię tu nic o uwierzytelnianiu klienta po stronie serwera. Jeśli serwer chce również przeprowadzić uwierzytelnianie klienta, serwer utrzymuje także trustStore w celu weryfikacji klienta.
źródło
Nie ma różnicy między plikami kluczy a plikami zaufanych certyfikatów. Oba są plikami w zastrzeżonym formacie JKS. Różnica polega na zastosowaniu: o ile mi wiadomo, Java będzie korzystać ze sklepu, do którego odwołuje się
-Djavax.net.ssl.trustStore
właściwość systemowa, do wyszukiwania certyfikatów, które można ufać podczas tworzenia połączeń SSL. To samo dotyczy kluczy i-Djavax.net.ssl.keyStore
. Ale teoretycznie dobrze jest używać tego samego pliku do zaufania i magazynów kluczy.źródło
javax.net.ssl.keyStoreType
ijavax.net.ssl.trustStoreType
.Magazyn kluczy jest używany przez serwer do przechowywania kluczy prywatnych, a Truststore jest używany przez klienta zewnętrznego do przechowywania kluczy publicznych dostarczonych przez serwer w celu uzyskania dostępu. Zrobiłem to w mojej aplikacji produkcyjnej. Poniżej przedstawiono kroki generowania certyfikatów Java do komunikacji SSL:
keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950
keytool -selfcert -alias mycert -keystore server.keystore -validity 3950
keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer
keytool -importcert -alias mycert -file mycert.cer -keystore truststore
źródło
Oto kroki, aby utworzyć magazyn zaufanych certyfikatów na lokalnym komputerze za pomocą Keytool. Kroki tworzenia magazynu zaufanych adresów URL na komputerze lokalnym.
1) Naciśnij adres URL w przeglądarce za pomocą chrome
2) Sprawdź ikonę „i” po lewej stronie adresu URL w chrome i kliknij ją
3) Sprawdź opcję certyfikatu i kliknij ją, a otworzy się okno dialogowe
4) sprawdź w zakładce „ścieżka certyfikatu” liczbę dostępnych certyfikatów do utworzenia magazynu zaufanych certyfikatów
5) Przejdź do tego,
"details" tab -> click"Copy to File" -> Give the path and the name for the certificate
który chcesz utworzyć.6) Sprawdź, czy ma certyfikaty nadrzędne i postępuj zgodnie z punktem „5” .
7) Po utworzeniu wszystkich certyfikatów otwórz wiersz polecenia i przejdź do ścieżki, w której utworzono certyfikaty.
8) wprowadź poniższe polecenie Keytool, aby dodać certyfikaty i utworzyć magazyn zaufanych certyfikatów.
9) Podaj polecenie keytool dla wszystkich certyfikatów i dodaj je do magazynu zaufania.
źródło
keystore po prostu przechowuje klucze prywatne, a wheras truststore przechowuje klucze publiczne. Będziesz chciał wygenerować certyfikat Java dla komunikacji SSL. Możesz użyć polecenia keygen w systemie Windows, prawdopodobnie będzie to najłatwiejsze rozwiązanie.
źródło
Mówiąc najprościej:
Magazyn kluczy służy do przechowywania poświadczeń (serwera lub klienta), a magazyn zaufań służy do przechowywania poświadczeń innych (Certyfikaty z urzędu certyfikacji).
Magazyn kluczy jest potrzebny podczas konfigurowania serwera po stronie SSL, służy do przechowywania certyfikatu tożsamości serwera, który serwer przedstawi klientowi podczas połączenia, a konfiguracja magazynu zaufania po stronie klienta musi zawierać, aby połączenie działało. Jeśli przeglądarka łączy się z dowolną witryną za pośrednictwem protokołu SSL, weryfikuje certyfikat przedstawiony przez serwer w odniesieniu do jego magazynu zaufanych certyfikatów.
źródło