Trust Store vs Key Store-tworzenie za pomocą keytool

Rozumiem, że keystore Zwykle przechowuje klucze prywatne/publiczne, a trust 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 jednak zainteresowany zrozumieniem, jak / kiedy odróżniasz sklepy podczas korzystania z keytool.

Do tej pory stworzyłem keystore używając

keytool -import -alias bob -file bob.crt -keystore keystore.ks

Który tworzy moją keystore.plik ks. Odpowiadam yes na pytanie, czy ufam Bobowi, ale nie jest dla mnie jasne, czy to utworzyło plik keystore czy plik truststore? Mogę skonfigurować moją aplikację, aby używała pliku jako albo.

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x

I po ustawieniu System.setProperty( "javax.net.debug", "ssl") mogę zobaczyć certyfikat w sekcji zaufane certyfikaty (ale nie w sekcji keystore). Konkretny certyfikat, który importuję, ma tylko klucz publiczny i zamierzam go użyć do wysyłania rzeczy przez połączenie SSL do Boba (ale być może lepiej zostawić dla kolejne pytanie!).

Wszelkie wskazówki i wyjaśnienia będą mile widziane. Czy wyjście keytool to to samo, co importujesz i jego konwencja, która mówi, że jeden jest magazynem keystore, a drugi magazynem zaufania? Jaka jest relacja podczas korzystania z SSL itp.?
Author: ROMANIA_engineer, 2011-06-14

5 answers

Terminologia jest rzeczywiście nieco myląca, ale zarówno javax.net.ssl.keyStore, jak i javax.net.ssl.trustStore są używane do określenia, których kluczy użyć, do dwóch różnych celów. Keystore występują w różnych formatach i niekoniecznie są plikami (zobacz to pytanie), a keytool jest tylko narzędziem do wykonywania różnych operacji na nich (import/export/list/...).

Parametry javax.net.ssl.keyStore i javax.net.ssl.trustStore są domyślnymi parametrami używanymi do budowania KeyManagers i TrustManagers (odpowiednio), a następnie używane do budowania SSLContext, które zasadniczo zawiera ustawienia SSL/TLS do użycia podczas nawiązywania połączenia SSL / TLS za pośrednictwem SSLSocketFactory lub SSLEngine. Te właściwości systemowe są tylko tam, skąd pochodzą wartości domyślne, które są następnie używane przez SSLContext.getDefault(), same używane przez SSLSocketFactory.getDefault() na przykład. (Wszystko to można dostosować za pomocą API w wielu miejscach, jeśli nie chcesz używać wartości domyślnych i konkretnych SSLContext s dla danego celu.)

Różnica między KeyManager i TrustManager (a więc między javax.net.ssl.keyStore i javax.net.ssl.trustStore) jest jak poniżej (cytat z jsse ref guide):

TrustManager: określa, czy poświadczenia zdalnego uwierzytelniania (oraz dlatego połączenie) powinno być zaufany.

KeyManager: określa, który dane uwierzytelniające do wysłania zdalny host.

(inne parametry są dostępne, a ich wartości domyślne są opisane w przewodniku jsse ref . Zauważ, że chociaż istnieje domyślna wartość dla sklepu zaufania, nie ma żadnego dla sklepu z kluczami.)

Zasadniczo magazyn kluczy w javax.net.ssl.keyStore ma zawierać klucze prywatne i certyfikaty, podczas gdy javax.net.ssl.trustStore ma zawierać certyfikaty CA, którym chcesz zaufać, gdy zdalna strona przedstawi swój certyfikat. W niektórych przypadkach mogą to być jeden i ten sam sklep, chociaż często lepiej jest używać odrębnych sklepów (zwłaszcza gdy są oparte na plikach).

 268
Author: Bruno,
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
2017-05-23 12:10:33

Nie ma różnicy między plikami keystore i truststore. Oba są plikami w zastrzeżonym formacie pliku JKS. Rozróżnienie jest w użyciu: z tego, co wiem, Java będzie używać tylko sklepu, do którego odwołuje się javax.net.ssl.trustStore, aby szukać certyfikatów, którym należy zaufać podczas tworzenia połączeń SSL. To samo dotyczy kluczy i javax.net.ssl.keyStore. Ale teoretycznie jest dobrze używać jednego i tego samego pliku dla zaufania - i keystore.

 22
Author: musiKk,
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
2011-06-14 08:35:27

Aby wyjaśnić w powszechnym użyciu / celu lub sposób laika:

TrustStore: Jak sama nazwa wskazuje, jest zwykle używany do przechowywania certyfikatów zaufanych podmiotów. Proces może utrzymywać magazyn certyfikatów wszystkich zaufanych stron któremu ufa.

KeyStore : używany do przechowywania kluczy serwera (zarówno publicznych, jak i prywatnych) wraz z podpisanym certyfikatem.

Podczas SSL handshake,

  1. Klient próbuje uzyskać dostęp https://

  2. W ten sposób serwer odpowiada dostarczając certyfikat SSL (który jest przechowywany w keyStore)

  3. Teraz klient otrzymuje certyfikat SSL i weryfikuje go za pośrednictwem trustStore (tzn. trustStore klienta ma już wstępnie zdefiniowany zestaw certyfikatów, którym ufa.). To tak: Czy Mogę zaufać temu serwerowi ? Czy to ten sam serwer, z którym próbuję rozmawiać ? Żadnych ataków pośredników ?

  4. Raz klient sprawdza, czy rozmawia z serwer, 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 zrobić uwierzytelnianie klienta zbyt, następnie serwer utrzymuje również trustStore do weryfikacji klienta.

 20
Author: Balaji Boggaram Ramanarayan,
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
2018-02-16 19:18:47

Keystore jest używany przez serwer do przechowywania kluczy prywatnych, a truststore jest używany przez klienta zewnętrznego do przechowywania kluczy publicznych dostarczanych przez serwer w celu uzyskania dostępu. Zrobiłem to w mojej aplikacji produkcyjnej. Poniżej znajdują się kroki generowania certyfikatów java dla komunikacji SSL:

  1. wygenerowanie certyfikatu za pomocą polecenia keygen w systemie windows:

Keytool-genkey-serwer keystore.keystore-alias mycert-20161109-keyalg RSA-keysize 2048-validity 3950

  1. Self poświadczyć certyfikat:

Keytool-selfcert-alias mycert-20161109-serwer keystore.keystore-validity 3950

  1. eksport certyfikatu do folderu:

Keytool-export-alias mycert-20161109-serwer keystore.keystore-rfc-file mycert-20161109.cer

  1. Import certyfikatu do Klienta Truststore:

Keytool-importcert-alias mycert-20161109-file C:\certs\mycert-20161109 -keystore .truststore

 9
Author: Akash5288,
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
2018-03-02 16:25:49

Keystore po prostu przechowuje klucze prywatne, gdzie truststore przechowuje klucze publiczne. Będziesz chciał wygenerować certyfikat java dla komunikacji SSL. Możesz użyć polecenia keygen w systemie windows, będzie to prawdopodobnie najprostsze rozwiązanie.

 1
Author: Team END_TECH,
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
2017-12-19 13:58:07