Différence entre un Keystore Java et un Truststore

Haut Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS

1. Vue d'ensemble

Dans cet article rapide, nous vous présenterons les différences entre un keystore Java et un truststore Java.

2. Concepts

Dans la plupart des cas, nous utilisons un keystore et un truststore lorsque notre application a besoin de communiquer via SSL / TLS .

Habituellement, ce sont des fichiers protégés par mot de passe qui reposent sur le même système de fichiers que notre application en cours d'exécution. Le format par défaut utilisé pour ces fichiers est JKS jusqu'à Java 8 .

Depuis Java 9, cependant, le format de fichier de clés par défaut est PKCS12 . La plus grande différence entre JKS et PKCS12 est que JKS est un format spécifique à Java, tandis que PKCS12 est un moyen standardisé et indépendant du langage de stocker des clés privées et des certificats chiffrés.

3. Java KeyStore

Un keystore Java stocke des entrées de clés privées, des certificats avec des clés publiques ou simplement des clés secrètes que nous pouvons utiliser à diverses fins cryptographiques. Il stocke chacun par un alias pour faciliter la recherche.

De manière générale, les keystores contiennent des clés que notre application possède et que nous pouvons utiliser pour prouver l'intégrité d'un message et l'authenticité de l'expéditeur, par exemple en signant des charges utiles.

Habituellement, nous utiliserons un keystore lorsque nous sommes un serveur et que nous voulons utiliser HTTPS . Lors d'une négociation SSL, le serveur recherche la clé privée dans le magasin de clés et présente sa clé publique et son certificat correspondants au client.

De même, si le client a également besoin de s'authentifier - une situation appelée authentification mutuelle - alors le client dispose également d'un keystore et présente également sa clé publique et son certificat.

Il n'y a pas de keystore par défaut, donc si nous voulons utiliser un canal chiffré, nous devrons définir javax.net.ssl.keyStore et javax.net.ssl.keyStorePassword. Si notre format de fichier de clés est différent de celui par défaut, nous pourrions utiliser javax.net.ssl.keyStoreType pour le personnaliser.

Bien sûr, nous pouvons également utiliser ces clés pour répondre à d'autres besoins. Les clés privées peuvent signer ou déchiffrer les données, et les clés publiques peuvent vérifier ou crypter les données. Les clés secrètes peuvent également remplir ces fonctions. Un keystore est un endroit où nous pouvons conserver ces clés.

Nous pouvons également interagir avec le keystore par programmation.

4. Java TrustStore

Un truststore est le contraire - alors qu'un keystore conserve généralement des certificats qui nous identifient, un truststore conserve des certificats qui identifient les autres.

En Java, nous l'utilisons pour faire confiance au tiers avec lequel nous sommes sur le point de communiquer.

Prenons notre exemple précédent. Si un client parle à un serveur Java via HTTPS, le serveur recherchera la clé associée dans son magasin de clés et présentera la clé publique et le certificat au client.

Nous, le client, recherchons ensuite le certificat associé dans notre truststore. Si le certificat ou les autorités de certification présentés par le serveur externe ne sont pas dans notre truststore, nous obtiendrons une exception SSLHandshakeException et la connexion ne sera pas établie avec succès.

Java a regroupé un truststore appelé cacerts et il réside dans le répertoire $ JAVA_HOME / jre / lib / security .

Il contient des autorités de certification approuvées par défaut:

$ keytool -list -keystore cacerts Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 92 entries verisignclass2g2ca [jdk], 2018-06-13, trustedCertEntry, Certificate fingerprint (SHA1): B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D

Nous voyons ici que le truststore contient 92 entrées de certificat de confiance et l'une des entrées est l' entrée verisignclass2gca . Cela signifie que la JVM fera automatiquement confiance aux certificats signés par verisignclass2g2ca .

Ici, nous pouvons remplacer l'emplacement par défaut du truststore via la propriété javax.net.ssl.trustStore . De même, nous pouvons définir javax.net.ssl.trustStorePassword et javax.net.ssl.trustStoreType pour spécifier le mot de passe et le type du truststore.

5. Conclusion

Dans ce didacticiel, nous avons abordé les principales différences entre le keystore Java et le truststore Java et leur objectif.

Nous avons également montré comment les valeurs par défaut peuvent être remplacées par les propriétés système.

Ensuite, nous pourrions consulter le guide SSL suivant ou le Guide de référence JSSE pour en savoir plus sur la communication chiffrée en Java.

Fond Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS