J'ai eu:
Sun.security.validator.ValidatorException: PKIX path building failed:
Sun.security.provider.certpath.SunCertPathBuilderException: unable to find
valid certification path to requested target
.
.
Caused by: javax.net.ssl.SSLHandshakeException: Sun.security.validator.
ValidatorException: PKIX path building failed: Sun.security.provider.
certpath.SunCertPathBuilderException: unable to find valid certification
path to requested target
En cherchant comment résoudre cette exception, je suis tombé sur le terme Keystore
que je ne comprends pas. Qu'est-ce que Keystore en termes simples? Comment est-ce lié à SSL?
Keystore dans Java peut faire référence à trois éléments, en fonction du contexte. (Ils sont tous étroitement liés mais subtilement différent.)
Un magasin de clés peut être un référentiel dans lequel des clés privées, des certificats et des clés symétriques peuvent être stockés. Il s'agit généralement d'un fichier, mais le stockage peut également être géré de différentes manières (par exemple, jeton cryptographique ou à l'aide du mécanisme propre du système d'exploitation).
KeyStore
est également une classe qui fait partie de l'API standard. C'est essentiellement une façon de charger, sauvegarder et généralement interagir avec l'un des magasins de clés "physiques" décrits ci-dessus. Un KeyStore
peut également être purement en mémoire, si vous avez simplement besoin de l'abstraction de l'API pour votre application.
Le chargement et la gestion d'une telle instance KeyStore
dépendent du format du fichier de clés (ou d'un autre système de stockage) qui le sauvegarde. Plusieurs formats sont disponibles. JKS et PKCS # 12 (.p12) sont parmi les plus courants.
"keystore" peut également être utilisé en tant que contrepartie de "truststore". C’est là que cela peut devenir confus, étant donné que les fichiers "keystore" et "truststore" sont des magasins de clés, ils sont simplement utilisés à des fins différentes. Vous pouvez trouver plus de détails dans cette réponse . Le magasin de clés est utilisé pour initialiser le gestionnaire de clés, alors que le magasin de clés est utilisé pour initialiser le gestionnaire de confiance. À partir du guide de référence JSSE :
Un
TrustManager
détermine si les informations d'identification d'authentification à distance (et donc la connexion) doivent être approuvées.Un
KeyManager
détermine les informations d'authentification à envoyer à l'hôte distant.
Essentiellement, un fichier de clés utilisé comme fichier de clés certifiées contiendra un certain nombre de certificats (CA) que vous êtes prêt à faire confiance: il s'agit des ancres de confiance que vous allez utiliser pour vérifier des certificats distants que vous ne connaissez pas déjà et auxquels vous ne faites pas confiance. En revanche, un magasin de clés utilisé comme magasin de clés contiendra votre propre certificat et sa clé privée: c'est ce que vous allez utiliser pour vous authentifier auprès d'une partie distante (le cas échéant).
Un fichier de clés certifiées par défaut est fourni avec le JRE (/lib/security/cacerts
). Il n'y a pas de magasin de clés par défaut, car il s'agit généralement d'une étape plus explicite pour l'utilisateur.
Dans le contexte de SSL/TLS, un fichier de clés (utilisé comme magasin de clés) sera l'emplacement où un serveur stockera son certificat et sa clé privée (ou, lorsque l'authentification par certificat client sera utilisée, où le client stockera son certificat et sa clé privée). Un fichier de clés certifiées (fichier de clés utilisé comme fichier de clés) est l'endroit où le client stocke les certificats des autorités de certification auxquelles il est prêt à faire confiance, afin de pouvoir vérifier le certificat de serveur lors de la connexion à un serveur SSL/TLS (de la même manière, côté serveur, c'est également là que sont stockés les certificats de l'autorité de certification utilisés pour vérifier les certificats clients).
En général, l’erreur que vous obtenez ("ValidatorException: PKIX path building failed
") se produit lorsque le certificat du serveur auquel vous vous connectez ne peut pas être vérifié à l’aide d’un certificat du fichier de relations de confiance que vous utilisez. Vous devez généralement avoir dans votre magasin de marques le certificat de serveur directement dans votre magasin de relations de confiance (qui est gérable uniquement à petite échelle) ou le certificat de l'autorité de certification utilisé par l'autorité de certification pour émettre ce certificat de serveur (ou l'un des certificats de la chaîne qu'il présente, lorsqu'il existe une chaîne).
En termes simples, pour établir une connexion avec un point de terminaison SSL, vous devez faire confiance à son certificat public. Pour faire confiance à un certificat, le certificat lui-même ou celui de son émetteur doit se trouver dans le magasin de clés.
Considérez le fichier de clés comme un ensemble de dossiers ou une base de données/référentiel contenant des certificats. Physiquement, il s’agit d’un fichier de la JRE (/lib/security/cacerts
).
Ce référentiel peut être modifié avec la commande keytool
fournie avec le JRE. Voir ce lien pour quelques commandes courantes. Une autre solution consiste à utiliser la boîte de dialogue Certificat du Panneau de configuration Java (il est également installé avec le JRE):