"PKIX path building failed" et "unable to find valid certification path to requested target"

a marqué ce sujet comme résolu.

J’ai un logiciel Java Custom D’entreprise, et j’ai un serveur Gravitee qui héberge mes API J’ai au moins 1K d’ordinateur sur lequel est lancé ce logiciel, et des fois j’obtiens cette erreur:

com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error : 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

J’obtiens cette erreur de manière "aléatoire":

  • 99% du temps je n’ai pas d’erreur
  • Quand j’obtiens cette erreur sur un des ordinateurs sur lequel le logiciel est lancée, la seule manière de résoudre le problème -> restart le logiciel (l’erreur durera toute la vie de la JVM)
  • Quand cette erreur apparait sur l’ordinateur 1, l’ordinateur 2 peut très bien faire des appels API à l’URL cible -> pas d’indisponibilité/inaccessibilité du serveur API

Informations supplémentaire:

  • l’API cible n’a pas de VIP (VirtualIP/LoadBalancer), c’est un serveur simple qui a toujours la même IP fixe
  • Le certificat que j’ajoute dans le KeyStore (cacert) est une chaine de certificat autosignée
  • l’URL de l’API cible est sur un domaine local (exemple: myAPI.myDomain.lan) -> donc pas besoin des Autorité de Certification Root (CA Root)
  • Je suis sur que mon certificat est correctement/fonctionnel au KeyStore puisque, si je le retire, j’obtiens -> TODO complete this
  • Je ne parviens pas à trouver une méthode de reproduction du problème
  • Pas de Proxy
  • Pas de headdump ou fuite memoire dans les logs
  • Java version 1.8.0_231_b11

J’ai l’impression d’avoir faire le tour sur la résolution du problème, et je ne parviens pas à le résoudre
J’ai besoin d’une méthodologie pour approcher ce problème

C’est assez étrange car cette erreur signifie le plus souvent que ton certificat n’est pas dans le cacerts ou bien que tu n’as pas importé le bon format (jks vs pkcs). Ce qui m’embête ici c’est que tu dis que si tu redémarres la JVM ça passe, autrement dit, quand il arrive à charger la jvm ça passe… Donc deux questions:

  • es tu sûr que l’url que tu atteins est toujours la même (par exemple, es-tu sûr qu’il n’y aurait pas un algo qui tente une fois d’aller sur myAPI.myDomain.lan et une autre fois sur myDomain.lan ou .local…)
  • es-tu sûr que dans les certificats que tu as importé tu as pas une vieille version du certificat qui ne serait plus valide?

le plus souvent que ton certificat n’est pas dans le cacerts ou bien que tu n’as pas importé le bon format (jks vs pkcs).

artragis

Je suis quasi certain à 99% que la JVM charge toujours le bon fichier JKS, le fichier où se trouve ma chaine de certificat

J’ai ajouté le logs SSL, Handshake aux paramètres de la JVM, et normalement avec ces logs, quand là JVM démarre, elle affiche:

  • Le JKS qui a été chargé
  • Tous les certificats qui se trouve dans le JKS
<jvmarg value="-Djava.net.debug=SSL,handshake" />
<jvmarg value="-Djava.security.debug=certpath" />

Maintenant, j’attends que le problème de PKIX se présente pour voir si je trouve quelque chose qui pose problème pas rapport au chargement du JKS/Certificat à l’intérieur


  • es tu sûr que l’url que tu atteins est toujours la même (par exemple, es-tu sûr qu’il n’y aurait pas un algo qui tente une fois d’aller sur myAPI.myDomain.lan et une autre fois sur myDomain.lan ou .local…)
artragis

Je suis sur que l’algo attaque toujours le bon sous domaine, car j’ai réalisé un TCPDUMP
Et je vois toujours le bon sous-domaine qui est appelé
D’ailleurs je peux aussi constater que le nom du certificat qui est utilisé est le bon aussi
Malheureusement je suis obligé d’anonymiser

  • Screenshot 1: Ici, Frame 4, je peux constater que l’URL de mon API est bien celle qui doit être appelée CaptureReseau_CorrectNS.JPG

  • Screenshot 2: Ici je peux constater que l’alias du certificat utilisé ressemble bien au nom de celui que j’ai importé dans le JKS CaptureReseau_CorrectCertificat.JPG

  • Screenshot 3: Ici on a le problème frame 12 de l’erreur TLS "Certificate Unknown" CaptureReseau_FRAME_12.jpg


  • es-tu sûr que dans les certificats que tu as importé tu as pas une vieille version du certificat qui ne serait plus valide?
artragis

Ma chaine de certificat a été ajouté dans le JKS (cacert), qui est le cacert par défaut de Java
Celui qui contient les ~90 CA Root

/usr/java/jdk1.8.0_231-amd64/jre/lib/security/cacerts

Dans ce JKS, je n’ai ajouté qu’un seul certificat (qui est une chaine de certificat)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte