Trust Store vs Key Store - tworzenie za pomocą keytool

249

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

Toby
źródło
Nie jestem pewien, co rozumiesz przez „Konkretny certyfikat, który importuję, ma tylko klucz publiczny”: czy jest to tylko klucz publiczny (tj. Nie certyfikat) czy certyfikat inny niż CA?
Bruno
hmmm, nie jestem pewien. Wyeksportowałem z przeglądarki jako plik PEM. To pomaga?
Toby
Jeśli jest eksportowany z przeglądarki, prawdopodobnie jest to certyfikat. Czy jest to certyfikat serwera (z CN lub podmiotAltName pasujący do nazwy serwera)? Czy jest to certyfikat CA (spójrz pod Podstawowe ograniczenia, powinieneś to zobaczyć za pomocą przeglądarki).
Bruno
2
tl; dr: magazyny zaufania zawierają publiczne, zaufane certyfikaty root (CA), podczas gdy magazyny tożsamości / kluczy zawierają prywatne certyfikaty tożsamości; jednak pod względem plików są takie same.
Andrew

Odpowiedzi:

346

Terminologia jest nieco mylące, rzeczywiście, ale zarówno javax.net.ssl.keyStorei javax.net.ssl.trustStoresą 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.keyStoreI javax.net.ssl.trustStoreparametry są domyślne parametry wykorzystywane do budowania KeyManagers i TrustManagers (odpowiednio), a następnie wykorzystywane do budowy SSLContext, która zasadniczo zawiera SSL / TLS ustawienia do wykorzystania przy podejmowaniu SSL / TLS poprzez połączenie SSLSocketFactorylub SSLEngine. Te właściwości systemowe są dokładnie tym, skąd pochodzą wartości domyślne, z których następnie korzysta SSLContext.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 konkretnych SSLContextdla określonego celu.)

Różnica między KeyManageri TrustManager(a więc między javax.net.ssl.keyStorei javax.net.ssl.trustStore) jest następująca (cytowana z przewodnika referencyjnego JSSE ):

TrustManager: Określa, czy należy uwierzytelnić poświadczenia zdalnego uwierzytelnienia (a tym samym połączenia).

KeyManager: Określa, które poświadczenia uwierzytelnienia wysłać do zdalnego hosta.

(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.keyStorema zawierać twoje prywatne klucze i certyfikaty, podczas gdy javax.net.ssl.trustStorepowinien 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).

Bruno
źródło
dzięki za odpowiedź, trochę to wyjaśnia. Nadal jestem zdezorientowany, jeśli chodzi o użytkowanie, mogę użyć klucza pk12 pri / pub (xxx.p12) jako magazynu kluczy (przez -D) i utworzyć połączenie SSL (zaufane) bez żadnej wzmianki o magazynie zaufania za pośrednictwem - D ... no cóż.
Toby
57
Nie musisz określać magazynu zaufanych certyfikatów, ponieważ istnieje dla niego wartość domyślna (jest dołączona do środowiska JRE), zwykle w $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.
Bruno
2
Dzięki za przydatne informacje. W Weblogic istnieje „magazyn kluczy tożsamości”, który przechowuje certyfikat SSL serwera, a następnie „magazyn kluczy zaufania”, który przechowuje certyfikaty SSL, którym ufa serwer, więc mam rację, jeśli powiem „klucz tożsamości” -store to nic innego jak „keystore”, a „trust-key-store” to tylko „truststore”?
hagrawal
@Bruno powinniśmy również zauważyć, że gdy występuje „jssecacerts”, „cacerts” jest ignorowany?
kommradHomer
61

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

TrustStore : jak sama nazwa wskazuje, zwykle służy do przechowywania certyfikatów zaufanych podmiotów. Proces może utrzymywać magazyn certyfikatów wszystkich zaufanych podmiotów, którym ufa.

keyStore : Używany do przechowywania kluczy serwera (publicznego i prywatnego) wraz z podpisanym certyfikatem.

Podczas uzgadniania protokołu SSL

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

  2. W ten sposób serwer odpowiada, podając certyfikat SSL (który jest przechowywany w magazynie kluczy)

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

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

Balaji Boggaram Ramanarayan
źródło
25

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

musiKk
źródło
4
Możesz użyć różnych typów magazynu kluczy (np. PKCS12), ustawiając właściwości systemowe javax.net.ssl.keyStoreTypei javax.net.ssl.trustStoreType.
Donal Fellows
1
@Donal: Dobry dodatek. Czy wiesz, czy istnieje lista wszystkich obsługiwanych kontenerów? Wiem tylko o PKCS12 i JKS (ten pierwszy jest wynikiem prób i błędów ...).
musiKk
2
formaty magazynu kluczy różnią się w zależności od dostępnych dostawców ( domyślnie zobacz tę listę w pakiecie z Oracle JRE). Dyskusja dotyczyła również tego pytania . Innych dostawców (np. BouncyCastle) można używać do innych formatów.
Bruno
21

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:

  1. Wygeneruj certyfikat za pomocą polecenia keygen w systemie Windows:

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

  1. Samocertyfikuj certyfikat:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. Eksportuj certyfikat do folderu:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

  1. Zaimportuj certyfikat do klienta Truststore:

keytool -importcert -alias mycert -file mycert.cer -keystore truststore

Akash5288
źródło
Cześć, mam jeden scenariusz, w którym mam dwie różne aplikacje w tym samym kontenerze (tomcat). Z obu aplikacji muszę wywoływać pozostałe punkty końcowe z obu stron do każdej aplikacji. Podobnie jak od A do B i B do A (A i B to dwie aplikacje). Czy w tym scenariuszu muszę korzystać z magazynu zaufania? Ponieważ korzystam z niestandardowego klienta odpoczynku, który korzysta z magazynu kluczy. Proszę zasugeruj.
Deepak
0

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

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) Podaj polecenie keytool dla wszystkich certyfikatów i dodaj je do magazynu zaufania.

    keytool -list -v -keystore cacerts
Ganesh Sha
źródło
-1

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.

Zespół END_TECH
źródło
Magazyn
Markiz Lorne
-1

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.

Snehal Masne
źródło