278 votes

Trust Store vs Key Store - création avec keytool

Je crois savoir que le keystore contient généralement les clés privées/publiques et que le trust store ne contient que les clés publiques (et représente la liste des parties de confiance avec lesquelles vous avez l'intention de communiquer). Eh bien, c'est ma première hypothèse, donc si ce n'est pas correct, je n'ai probablement pas très bien commencé...

J'étais cependant intéressé de comprendre comment / quand vous distinguez les magasins lorsque vous utilisez keytool.

Jusqu'à présent, j'ai créé un keystore en utilisant

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

qui crée mon fichier keystore.ks. Je réponds yes à la question do I trust bob mais je ne sais pas si cela a créé un fichier keystore ou un fichier truststore ? Je peux configurer mon application pour utiliser le fichier comme l'un ou l'autre.

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

et avec System.setProperty( "javax.net.debug", "ssl") Je peux voir le certificat sous les certifications de confiance (mais pas dans la section keystore). Le certificat particulier que j'importe n'a qu'une clé publique et j'ai l'intention de l'utiliser pour envoyer des informations à Bob via une connexion SSL (mais peut-être est-ce une autre question !).

Toute indication ou clarification serait très appréciée. Est-ce que la sortie de keytool est la même quelle que soit l'importation et c'est juste une convention qui dit que l'un est un keystore et l'autre un trust store ? Quelle est la relation avec l'utilisation de SSL, etc ?

0 votes

Je ne suis pas sûr de ce que vous voulez dire par "Le certificat particulier que j'importe n'a qu'une clé publique" : s'agit-il seulement d'une clé publique (c'est-à-dire pas un certificat) ou d'un certificat non-CA ?

0 votes

Hmmm, pas sûr. J'ai exporté à partir de mon navigateur comme un fichier PEM. Est-ce que cela aide ?

0 votes

Si c'est exporté depuis le navigateur, c'est probablement un certificat. S'agit-il d'un certificat de serveur (avec un CN ou un subjectAltName correspondant au nom d'un serveur) ? S'agit-il d'un certificat d'autorité de certification (regardez sous Contraintes de base, vous devriez être en mesure de le voir en utilisant votre navigateur).

386voto

Bruno Points 47560

La terminologie est un peu confuse en effet, mais à la fois javax.net.ssl.keyStore et javax.net.ssl.trustStore sont utilisés pour spécifier les keystores à utiliser, dans deux buts différents. Les référentiels de clés se présentent sous différents formats et ne sont même pas nécessairement des fichiers (cf. cette question ), et keytool n'est qu'un outil permettant d'effectuer diverses opérations sur eux (import/export/list/...).

Le site javax.net.ssl.keyStore et javax.net.ssl.trustStore sont les paramètres par défaut utilisés pour construire KeyManager et TrustManager (respectivement), puis utilisés pour construire une SSLContext qui contient essentiellement les paramètres SSL/TLS à utiliser lors de l'établissement d'une connexion SSL/TLS par l'intermédiaire d'un fichier SSLSocketFactory ou un SSLEngine . Ces propriétés du système sont juste l'endroit d'où proviennent les valeurs par défaut, qui sont alors utilisées par SSLContext.getDefault() lui-même utilisé par SSLSocketFactory.getDefault() par exemple. (Tout ceci peut être personnalisé via l'API à un certain nombre d'endroits, si vous ne souhaitez pas utiliser les valeurs par défaut et que vous avez besoin d'informations spécifiques. SSLContext pour un objectif donné).

La différence entre le KeyManager et TrustManager (et donc entre javax.net.ssl.keyStore et javax.net.ssl.trustStore ) est la suivante (citée du Guide de référence JSSE ) :

TrustManager : Détermine si les les informations d'authentification à distance (et (et donc la connexion) doivent être confiance.

KeyManager : Détermine quelles les informations d'authentification à envoyer à l'hôte distant.

(D'autres paramètres sont disponibles et leurs valeurs par défaut sont décrites dans la section Guide de référence JSSE . Notez que s'il existe une valeur par défaut pour le magasin de confiance, il n'y en a pas pour le magasin de clés).

Essentiellement, le keystore dans javax.net.ssl.keyStore est destiné à contenir vos clés privées et vos certificats, alors que le fichier javax.net.ssl.trustStore est destiné à contenir les certificats de l'autorité de certification auxquels vous êtes prêt à faire confiance lorsqu'une partie distante présente son certificat. Dans certains cas, il peut s'agir d'un seul et même magasin, bien qu'il soit souvent préférable d'utiliser des magasins distincts (surtout lorsqu'ils sont basés sur des fichiers).

0 votes

Merci pour la réponse, cela clarifie un peu les choses. Je suis toujours confus quand il s'agit de l'utilisation, je peux utiliser une clé pk12 pri/pub (xxx.p12) comme keystore (via -D) et créer une connexion SSL (trusted) sans aucune mention d'un truststore via -D... oh bien.

67 votes

Vous n'avez pas besoin de spécifier un truststore, car il existe une valeur par défaut pour celui-ci (il est fourni avec le JRE), généralement dans le champ $JAVA_HOME/lib/security/cacerts (voir le lien du guide de référence de la 2e JSSE que j'ai envoyé). Comme les navigateurs, il contient un ensemble par défaut de certificats CA de confiance. En général, un client utilisera toujours un truststore pour vérifier le certificat du serveur mais le keystore ne sera utilisé que si le serveur demande un certificat client, et le serveur utilisera toujours un keystore pour sa propre clé+cert mais le truststore ne sera utilisé que si le client envoie un certificat client.

2 votes

Merci pour ces informations utiles. Dans Weblogic, il y a "identity-key-store" qui stocke le certificat SSL du serveur et ensuite "trust-key-store" qui stocke les certificats SSL auxquels le serveur fait confiance. Ai-je raison de dire que "identity-key-store" n'est rien d'autre qu'un "keystore" et "trust-key-store" rien d'autre qu'un "truststore" ?

92voto

Expliquer en termes d'usage/de but commun ou de manière profane :

TrustStore : Comme son nom l'indique, il est normalement utilisé pour stocker les certificats d'entités de confiance. Un processus peut maintenir un magasin de certificats de tous ses partenaires de confiance. en qui il a confiance.

keyStore : Utilisé pour stocker les clés du serveur (publiques et privées) ainsi que le certificat signé.

Pendant la poignée de main SSL,

  1. Un client essaie d'accéder à https://

  2. Ainsi, le serveur répond en fournissant un certificat SSL (qui est stocké dans son keyStore).

  3. Maintenant, le client reçoit le certificat SSL et le vérifie via le trustStore (c'est-à-dire que le trustStore du client a déjà un ensemble prédéfini de certificats auxquels il fait confiance). C'est comme si : Puis-je faire confiance à ce serveur ? S'agit-il du même serveur que celui auquel j'essaie de parler ? Pas d'attaque par un intermédiaire ?

  4. Une fois que le client a vérifié qu'il s'adresse à un serveur en qui il a confiance, la communication SSL peut se faire sur une clé secrète partagée.

Note : Je ne parle pas ici de l'authentification du client du côté du serveur. Si un serveur veut aussi faire une authentification client, alors le serveur maintient aussi un trustStore pour vérifier le client. Il s'agit alors de TLS mutuel

1 votes

Super, c'est plus facile à comprendre avec un exemple. Merci !

27voto

musiKk Points 6933

Il n'y a pas de différence entre les fichiers keystore et truststore. Tous deux sont des fichiers au format propriétaire JKS. La distinction réside dans l'utilisation : Pour autant que je sache, Java n'utilisera que le magasin référencé par la balise -Djavax.net.ssl.trustStore propriété du système pour rechercher les certificats auxquels il faut faire confiance lors de la création de connexions SSL. Idem pour les clés et les -Djavax.net.ssl.keyStore . Mais en théorie, il est possible d'utiliser un seul et même fichier pour les magasins de confiance et les magasins de clés.

4 votes

Vous pouvez utiliser différents types de keystore (par exemple, PKCS12) en définissant l'attribut javax.net.ssl.keyStoreType et javax.net.ssl.trustStoreType les propriétés du système.

1 votes

@Donal : Bon ajout. Savez-vous s'il existe une liste de tous les conteneurs supportés ? Je ne connais que PKCS12 et JKS (le premier étant le résultat d'essais et d'erreurs...).

2 votes

Les formats de keystore varient en fonction des fournisseurs disponibles (cf. cette liste pour ceux fournis par défaut avec le JRE d'Oracle). Il y a également eu une discussion dans cette question . D'autres fournisseurs (par exemple BouncyCastle) peuvent être utilisés pour d'autres formats.

24voto

akash746 Points 109

Keystore est utilisé par un serveur pour stocker les clés privées, et Truststore est utilisé par un client tiers pour stocker les clés publiques fournies par le serveur pour y accéder. J'ai fait cela dans mon application de production. Voici les étapes pour générer des certificats java pour la communication SSL :

  1. Générer un certificat en utilisant la commande keygen dans Windows :

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

  1. Autocertifier le certificat :

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

  1. Exporter le certificat dans un dossier :

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

  1. Importer le certificat dans le Truststore du client :

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

0 votes

Bonjour, j'ai un scénario dans lequel j'ai deux applications différentes dans le même conteneur (tomcat). À partir des deux applications, je dois appeler les points d'extrémité de repos des deux côtés de chaque application. Par exemple, de A à B et de B à A (A et B sont les deux applications). Dois-je utiliser le truststore dans ce scénario ? Car j'utilise un client de repos personnalisé qui utilise un keystore. Veuillez me conseiller.

0voto

Ganesh Sha Points 1

Voici les étapes pour créer un Truststore dans votre machine locale en utilisant Keytool. Étapes à suivre pour créer un Truststore pour une URL dans votre machine locale.

1) Cliquez sur l'url dans le navigateur en utilisant chrome.

2) Vérifiez que le "i" à gauche de l'url dans le chrome et cliquez dessus.

3) Vérifiez que option de certificat et cliquez dessus. Une boîte de dialogue s'ouvrira.

4) vérifier le "onglet "chemin du certificat pour le nombre de certificats disponibles pour créer le truststore

5) Allez le "details" tab -> click"Copy to File" -> Give the path and the name for the certificate que vous voulez créer.

6) Vérifiez s'il a des certificats parentaux et suivez le point "5" .

7) Après la création de tous les certificats, ouvrez l'invite de commande et naviguez vers le chemin où vous avez créé les certificats.

8) fournir la commande Keytool ci-dessous pour ajouter les certificats et créer un truststore.

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) Fournir la commande keytool pour tous les certificats et les ajouter au magasin de confiance.

    keytool -list -v -keystore cacerts

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X