Type de keystore: lequel utiliser?

115

En regardant le fichier java.securityde my JRE, je vois que le type de keystore à utiliser par défaut est défini sur JKS. Ici , il y a une liste des types de keystore qui peuvent être utilisés.

Existe-t-il un type de fichier de clés recommandé? Quels sont les avantages / inconvénients des différents types de keystore?

Mickael Marrache
la source
4
Depuis Java 9, PKCS12 est le type de fichier de clés par défaut. Ce changement est à l'objectif de JEP 229: "Améliorer la sécurité. PKCS12 offre des algorithmes cryptographiques plus puissants que JKS." Pour plus d'informations, consultez «JEP 229: Créer des fichiers de clés PKCS12 par défaut», openjdk.java.net/jeps/229 ; Consulté pour la dernière fois le 2 février 2018.
buzz3791

Réponses:

142

Il existe quelques types de plus que ce qui est répertorié dans la liste de noms standard à laquelle vous êtes lié. Vous pouvez en savoir plus dans la documentation des fournisseurs de cryptographie . Les plus courants sont certainement JKS(la valeur par défaut) et PKCS12(pour les fichiers PKCS # 12, souvent avec une extension .p12ou parfois .pfx).

JKS est le plus courant si vous restez dans le monde Java. PKCS # 12 n'est pas spécifique à Java, il est particulièrement pratique d'utiliser des certificats (avec des clés privées) sauvegardés à partir d'un navigateur ou provenant d'outils basés sur OpenSSL ( keytoolimpossible de convertir un keystore et d'importer ses clés privées avant Java 6 , vous avez donc dû utiliser d'autres outils).

Si vous avez déjà un fichier PKCS # 12, il est souvent plus facile d'utiliser PKCS12directement le type. Il est possible de convertir des formats, mais c'est rarement nécessaire si vous pouvez choisir directement le type de fichier de clés.

Dans Java 7, PKCS12était principalement utile en tant que keystore mais moins pour un truststore (voir la différence entre un keystore et un truststore ), car vous ne pouviez pas stocker les entrées de certificat sans clé privée. En revanche, JKSne nécessite pas que chaque entrée soit une entrée de clé privée, vous pouvez donc avoir des entrées qui contiennent uniquement des certificats, ce qui est utile pour les magasins de confiance, où vous stockez la liste des certificats auxquels vous faites confiance (mais vous n'avez pas le clé privée pour eux).

Cela a changé dans Java 8, vous pouvez donc désormais avoir des entrées de certificat uniquement dans les PKCS12magasins. (Vous trouverez plus de détails sur ces modifications et d'autres plans dans JEP 229: Créer des keystores PKCS12 par défaut .)

Il existe quelques autres types de keystore, peut-être moins fréquemment utilisés (selon le contexte), notamment:

  • PKCS11, pour les bibliothèques PKCS # 11, généralement pour accéder aux jetons cryptographiques matériels, mais l'implémentation du fournisseur Sun prend également en charge les magasins NSS (de Mozilla) à travers cela.
  • BKS, en utilisant le fournisseur BouncyCastle (couramment utilisé pour Android).
  • Windows-MY/ Windows-ROOT, si vous souhaitez accéder directement au magasin de certificats Windows.
  • KeychainStore, si vous souhaitez utiliser directement le trousseau OSX.
Bruno
la source
7
@husayt, les certificats PEM ne sont pas directement pris en charge en tant que types de keystore (je suppose que l'on pourrait écrire une KeyStoreimplémentation à cet effet). Vous pouvez cependant les charger à la volée dans une instance de keystore (généralement JKS, le type par défaut) en mémoire à l'aide de CertificateFactory(comme indiqué dans cette réponse ).
Bruno
Je pense que le JKSa changé enJCEKS
amphibient
5
De manière plutôt critique, un magasin de clés JKS ne peut pas stocker de clés secrètes. Pour ce cas d'utilisation, JCEKS est approprié. Cela vaut peut-être la peine de le mentionner dans votre réponse.
Duncan Jones
1
D'accord. Dans Java 8, je peux créer un keystore PKCS # 12 avec un seul certificat sans aucun problème. Notez que les entrées de certificat P12 sont implicitement approuvées. Si vous avez besoin de certificats non approuvés, vous devrez peut-être revenir à un schéma avec plusieurs magasins de clés.
Maarten Bodewes
2
OK au moins pour les magasins de clés Java 8 PKCS # 12 ne peuvent toujours pas stocker les entrées de clé secrète . Vous obtiendrez une exception de pointeur nul lors du stockage d'un tel magasin de clés (ugh), probablement parce qu'il ne peut pas trouver les certificats associés. Quelqu'un a apparemment sauté les enseignements de Joshua sur le code à échec rapide.
Maarten Bodewes
22

Voici un article qui présente différents types de keystore en Java et les différences entre les différents types de keystore. http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----Overview

Vous trouverez ci-dessous les descriptions des différents keystores de l'article:

JKS, magasin de clés Java. Vous pouvez trouver ce fichier sur sun.security.provider.JavaKeyStore. Ce keystore est spécifique à Java, il a généralement une extension de jks. Ce type de fichier de clés peut contenir des clés privées et des certificats, mais il ne peut pas être utilisé pour stocker des clés secrètes. Puisqu'il s'agit d'un keystore spécifique à Java, il ne peut donc pas être utilisé dans d'autres langages de programmation.

JCEKS, magasin de clés JCE. Vous pouvez trouver ce fichier sur com.sun.crypto.provider.JceKeyStore. Ce keystore a une extension de jceks. Les entrées qui peuvent être placées dans le keystore JCEKS sont des clés privées, des clés secrètes et des certificats.

PKCS12, il s'agit d'un type de fichier de clés standard qui peut être utilisé en Java et dans d'autres langages. Vous pouvez trouver cette implémentation de keystore sur sun.security.pkcs12.PKCS12KeyStore. Il a généralement une extension de p12 ou pfx. Vous pouvez stocker des clés privées, des clés secrètes et des certificats sur ce type.

PKCS11, il s'agit d'un type de keystore matériel. Il sert d'interface pour que la bibliothèque Java se connecte aux périphériques de stockage de clés matériels tels que Luna, nCipher. Vous pouvez trouver cette implémentation sur sun.security.pkcs11.P11KeyStore. Lorsque vous chargez le fichier de clés, vous n'avez pas besoin de créer un fournisseur spécifique avec une configuration spécifique. Ce keystore peut stocker des clés privées, des clés secrètes et des cétrifications. Lors du chargement du keystore, les entrées seront récupérées du keystore puis converties en entrées logicielles.

PixelsTech
la source
@ peci1 J'ai prévu d'écrire des tutoriels sur l'utilisation de ces keystores. Jusqu'à présent, j'ai écrit un article pour JKS, veuillez le trouver sur pixelstech.net/article/…
PixelsTech
@PixelsTech J'ai trouvé celui-ci et je me demandais où sont les autres :) Alors je vais rester à l'écoute;) Merci
Martin Pecka
1
@ peci1 J'ai couvert JCEKS et PKCS12 aujourd'hui. Pour PKCS11, cela implique du matériel et une configuration supplémentaire, il faut plus de temps pour le composer. pixelstech.net/article/… et pixelstech.net/article/…
PixelsTech
Wow, c'est une vitesse fulgurante! Merci beaucoup.
Martin Pecka
5

Si vous utilisez Java 8 ou plus récent, vous devez absolument choisir PKCS12la valeur par défaut depuis Java 9 ( JEP 229 ).

Les avantages par rapport à JKSet JCEKSsont:

  • Les clés secrètes, les clés privées et les certificats peuvent être stockés
  • PKCS12est un format standard, il peut être lu par d'autres programmes et bibliothèques 1
  • Amélioration de la sécurité: JKSet JCEKSsont assez peu sûrs. Cela peut être vu par le nombre d'outils pour forcer brutalement les mots de passe de ces types de keystore, particulièrement populaires parmi les développeurs Android. 2, 3

1 Il y a JDK-8202837 , qui a été corrigé dans Java 11

2 Le nombre d'itérations pour PBE utilisé par tous les types de keystore (y compris PKCS12) était plutôt hebdomadaire ( CVE-2017-10356 ), mais cela a été corrigé dans 9.0.1, 8u151, 7u161 et 6u171

3 Pour en savoir plus:

Marcono1234
la source