Typ magazynu kluczy: którego użyć?

115

Patrząc na plik java.securitymy JRE, widzę, że domyślnym typem magazynu kluczy jest JKS. Tutaj znajduje się lista typów kluczy, których można użyć.

Czy istnieje zalecany typ magazynu kluczy? Jakie są wady / zalety różnych typów magazynów kluczy?

Mickael Marrache
źródło
4
Od wersji Java 9 domyślnym typem magazynu kluczy jest PKCS12. Ta zmiana jest zgodna z celem JEP 229: „Poprawa bezpieczeństwa. PKCS12 oferuje silniejsze algorytmy kryptograficzne niż JKS”. Aby uzyskać więcej informacji, zobacz „JEP 229: Domyślne tworzenie magazynów kluczy PKCS12”, openjdk.java.net/jeps/229 ; ostatni dostęp 2 lutego 2018 r.
buzz3791

Odpowiedzi:

142

Istnieje kilka innych typów niż te, które są wymienione na standardowej liście nazw, z którą łączysz się. Więcej informacji można znaleźć w dokumentacji dostawców usług kryptograficznych . Najpopularniejsze z nich to z pewnością JKS(domyślne) i PKCS12(dla plików PKCS # 12, często z rozszerzeniem .p12lub czasami .pfx).

JKS jest najbardziej powszechny, jeśli pozostajesz w świecie Java. PKCS # 12 nie jest specyficzny dla Javy, szczególnie wygodne jest używanie certyfikatów (z kluczami prywatnymi) z kopii zapasowej z przeglądarki lub pochodzących z narzędzi opartych na OpenSSL ( keytoolnie był w stanie przekonwertować magazynu kluczy i zaimportować jego kluczy prywatnych przed Java 6 , więc musiałeś użyć innych narzędzi).

Jeśli masz już plik PKCS # 12, często łatwiej jest PKCS12bezpośrednio użyć tego typu. Konwersja formatów jest możliwa, ale rzadko jest to konieczne, jeśli można bezpośrednio wybrać typ magazynu kluczy.

W Javie 7 PKCS12był używany głównie jako magazyn kluczy, ale mniej w przypadku magazynu zaufanych certyfikatów (zobacz różnicę między magazynem kluczy a magazynem zaufanych certyfikatów ), ponieważ nie można przechowywać wpisów certyfikatów bez klucza prywatnego. W przeciwieństwie do tego, JKSnie wymaga, aby każdy wpis był wpisem klucza prywatnego, więc możesz mieć wpisy zawierające tylko certyfikaty, co jest przydatne w przypadku magazynów zaufania, w których przechowujesz listę zaufanych certyfikatów (ale nie masz klucz prywatny dla nich).

Zmieniło się to w Javie 8, więc teraz w PKCS12sklepach możesz mieć wpisy zawierające tylko certyfikaty . (Więcej szczegółów na temat tych zmian i dalszych planów można znaleźć w JEP 229: Domyślne tworzenie magazynów kluczy PKCS12 ).

Istnieje kilka innych typów magazynów kluczy, być może rzadziej używanych (w zależności od kontekstu). Są to:

  • PKCS11, dla bibliotek PKCS # 11, zwykle do uzyskiwania dostępu do sprzętowych tokenów kryptograficznych, ale implementacja dostawcy Sun obsługuje również magazyny NSS (z Mozilli).
  • BKSprzy użyciu dostawcy BouncyCastle (powszechnie używanego w systemie Android).
  • Windows-MY/ Windows-ROOT, jeśli chcesz uzyskać bezpośredni dostęp do magazynu certyfikatów systemu Windows.
  • KeychainStore, jeśli chcesz bezpośrednio użyć pęku kluczy OSX.
Bruno
źródło
7
@husayt, certyfikaty PEM nie są bezpośrednio obsługiwane jako typy magazynu kluczy (przypuszczam, że można by napisać odpowiednią KeyStoreimplementację). Możesz jednak załadować je w locie do instancji magazynu kluczy (zwykle JKS, typ domyślny) w pamięci za pomocą CertificateFactory(jak pokazano w tej odpowiedzi ).
Bruno,
myślę, że JKSzmienił się naJCEKS
amfibia
5
Raczej krytycznie, magazyn kluczy JKS nie może przechowywać kluczy tajnych. W tym przypadku JCEKS jest odpowiedni. Warto o tym wspomnieć w swojej odpowiedzi.
Duncan Jones
1
Dobrze. W Javie 8 mogę bez problemu stworzyć magazyn kluczy PKCS # 12 z jednym certyfikatem. Należy zauważyć, że wpisy certyfikatów P12 są niejawnie zaufane. Jeśli potrzebujesz niezaufanych certyfikatów, może być konieczne przywrócenie schematu z wieloma magazynami kluczy.
Maarten Bodewes
2
OK, przynajmniej w przypadku magazynów kluczy Java 8 PKCS # 12 nadal nie można przechowywać wpisów tajnych kluczy . Podczas przechowywania takiego magazynu kluczy otrzymasz zerowy wyjątek wskaźnika (ugh), prawdopodobnie dlatego, że nie może znaleźć powiązanych certyfikatów. Ktoś najwyraźniej pominął naukę Joshuy na temat szybkiego kodu niepowodzenia.
Maarten Bodewes
22

Oto post, który przedstawia różne typy magazynu kluczy w Javie i różnice między różnymi typami magazynu kluczy. http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----Overview

Poniżej znajdują się opisy różnych magazynów kluczy z postu:

JKS, Java Key Store. Ten plik można znaleźć pod adresem sun.security.provider.JavaKeyStore. Ten magazyn kluczy jest specyficzny dla języka Java i zwykle ma rozszerzenie jks. Ten typ magazynu kluczy może zawierać klucze prywatne i certyfikaty, ale nie można go używać do przechowywania kluczy tajnych. Ponieważ jest to magazyn kluczy specyficzny dla języka Java, nie można go używać w innych językach programowania.

Magazyn kluczy JCEKS, JCE. Ten plik można znaleźć pod adresem com.sun.crypto.provider.JceKeyStore. Ten magazyn kluczy ma rozszerzenie jceks. Wpisy, które można umieścić w magazynie kluczy JCEKS, to klucze prywatne, klucze tajne i certyfikaty.

PKCS12, jest to standardowy typ magazynu kluczy, którego można używać w Javie i innych językach. Implementację tego magazynu kluczy można znaleźć pod adresem sun.security.pkcs12.PKCS12KeyStore. Zwykle ma rozszerzenie p12 lub pfx. Na tym typie można przechowywać klucze prywatne, tajne klucze i certyfikaty.

PKCS11, to sprzętowy magazyn kluczy. Serwuje interfejs dla biblioteki Java do łączenia się ze sprzętowymi urządzeniami magazynu kluczy, takimi jak Luna, nCipher. Implementację tę można znaleźć pod adresem sun.security.pkcs11.P11KeyStore. Podczas ładowania magazynu kluczy nie ma potrzeby tworzenia konkretnego dostawcy z określoną konfiguracją. Ten magazyn kluczy może przechowywać klucze prywatne, tajne klucze i certyfikaty. Podczas ładowania magazynu kluczy wpisy zostaną pobrane z magazynu kluczy, a następnie przekształcone w wpisy oprogramowania.

PixelsTech
źródło
@ peci1 Planowałem napisać kilka samouczków na temat korzystania z tych magazynów kluczy. Do tej pory napisałem jeden post dla JKS, znajdź go na pixelstech.net/article/ ...
PixelsTech
@PixelsTech Znalazłem ten jeden i było zastanawiać, gdzie jest reszta :) Więc będę zaglądajcie;) Dzięki
Martin Pecka
1
@ peci1 Omówiłem dzisiaj JCEKS i PKCS12. W przypadku PKCS11 wymaga sprzętu i dodatkowej konfiguracji, wymaga więcej czasu na jej skomponowanie. pixelstech.net/article/ ... i pixelstech.net/article/ ...
PixelsTech
Wow, to błyskawica! Dziękuję bardzo.
Martin Pecka
5

Jeśli używasz Java 8 lub nowszej, zdecydowanie powinieneś wybrać PKCS12domyślną wersję od Java 9 ( JEP 229 ).

Zalety w porównaniu z JKSi JCEKSto:

  • Można przechowywać klucze tajne, klucze prywatne i certyfikaty
  • PKCS12jest formatem standardowym, może być odczytany przez inne programy i biblioteki 1
  • Zwiększone bezpieczeństwo: JKSi JCEKSsą dość niepewne. Widać to po liczbie narzędzi do brutalnego wymuszania haseł tych typów magazynów kluczy, szczególnie popularnych wśród programistów Androida. 2, 3

1 Jest JDK-8202837 , który został poprawiony w Javie 11

2 Liczba iteracji dla PBE używanego przez wszystkie typy magazynów kluczy (w tym PKCS12) wynosiła raczej tydzień ( CVE-2017-10356 ), jednak zostało to naprawione w wersjach 9.0.1, 8u151, 7u161 i 6u171

3 Więcej informacji:

Marcono1234
źródło