PKIX chemin de bâtiment échoué dans l'application Java
J'ai été mal pendant presque une semaine pour avoir mes applications en cours d'exécution après le déplacement de mes applications de Windows 2000 vers Windows Server 2008 R2.
La procédure:
- Installé le JDK Java 1.7.0_25
- Définir une variable d'environnement système
JAVA_HOME
àC:\Progra~1\Java\jdk1.7.0_25\
- Importé le certificat dans le fichier cacerts avec
keytool
- Veillé à ce que le certificat existe dans
keytool
avec-list
.
J'ai essayé de répéter étape 3 avec InstallCert
pour s'assurer que je n'ai pas loupé quelque chose jusqu'.
Les méthodes ci-dessus n'a pas résolu mon problème, j'ai donc essayé de le faire par programmation:
System.setProperty("javax.net.ssl.trustStore",
"C:/Progra~1/Java/jdk1.7.0_25/jre/lib/security/cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Toujours sans un peu de chance. Je suis coincé et pas tout à fait sûr de la direction pour aller à partir d'ici.
Trace de la pile:
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
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:515)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
at util.SMS.send(SMS.java:93)
at domain.ActivationSMSSenderMain.sendActivationMessagesToCustomers(ActivationSMSSenderMain.java:80)
at domain.ActivationSMSSenderMain.<init>(ActivationSMSSenderMain.java:44)
at domain.ActivationSMSSenderMain.main(ActivationSMSSenderMain.java:341)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
... 14 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
... 20 more
Mise à JOUR:
À la fois
System.out.println(System.getProperty("javax.net.ssl.trustStore"));
et
System.out.println(System.getProperty("javax.net.ssl.keyStore"));
retourne null
.
- avez-vous ajouté votre certificats intermédiaires?
- Je ne suis pas tout à fait sûr que vous voulez dire, mais je n'ai pas touché aux certificats par défaut dans le fichier cacerts.
- intermédiaire cert se réfère à votre cert émetteur. si votre cert émetteur n'est pas digne de confiance, votre cert est également non fiables. par exemple, pour authentifier google.com vous devrez également ajouter Google Internet de l'Autorité et de GeoTrust pour truststore.
- Donc, si j'ouvre le
Certification path
dans Chrome, je vois un arbre structureGeotrust Global CA -> RapidSSL CA -> *.thedomain.com
. J'ai besoin d'ajouter les deux premières aswell? - oui, ils sont nécessaires.
- Le GlobalCA a déjà été ajouté, mais RapidSSL manquait. Malheureusement, il n'a pas de résoudre mon problème..
- Pouvez-vous montrer le résultat de votre programme lorsque vous l'exécutez avec
-Djavax.net.debug=all
? - beny23, la sortie est assez longue, où dois-je inclure ce?
- J'ai téléchargé le dump sur pastebin pastebin.com/W3Akw4M9
- Magdaléno j'ai essayé toutes les étapes pour importer des tiers certificat dans le fichier cacerts comme vous l'avez mentionné, cependant, je reçois toujours la même Exception
Vous devez vous connecter pour publier un commentaire.
J'ai couru dans des problèmes similaires dont la cause et la solution s'est avéré à la fois être plutôt simple:
Principale Cause: n'A pas d'importer le bon cert à l'aide de keytool
REMARQUE: Uniquement l'importation d'autorité de certification racine (ou de votre propre auto-signé) certificats
REMARQUE: ne pas importer un intermédiaire, non de la chaîne de certification racine cert
Exemple de Solution pour imap.gmail.com
Déterminer la racine CA cert:
dans ce cas, nous trouvons l'autorité de certification racine est Equifax Secure Autorité de certification
Importation cert pour
javax.net.ssl.trustStore
:-keystore path/to/jre/lib/security/cacerts
à la commande à l'étape 4.Vous avez importé le certificat dans le truststore de la JRE fourni avec le JDK, mais vous sont en cours d'exécution de la java.exe de la JRE installé directement.
MODIFIER
Pour plus de clarté, et pour résoudre le bourbier de l'incompréhension dans le commentaire ci-dessous, vous devez importer le certificat dans le
cacerts
fichier de la JRE vous avez l'intention d'utiliser, et de que rarement, si jamais l'un d'expédition à l'intérieur de la JDK, parce que les clients ne peuvent pas l'habitude d'avoir un JDK. Rien dans le commentaire ci-dessous suggèrent le contraire doit être ignoré comme exprimant pas mon intention ici.Une bien meilleure solution serait de créer votre propre truststore, en commençant avec une copie de la
cacerts
fichier, et spécifiquement dire Java pour l'utiliser par le biais du système de la propriétéjavax.net.ssl.trustStore.
Vous devriez faire de la construction de cette partie de votre processus de création, afin de garder à jour avec les modifications que je le
cacerts
fichier causés par le JDK mises à jour.cacerts
aswell, sans aucune différence.cacerts
de magasin de clés. Ce EJP est en train de vous dire, c'est de faire en sorte que lorsque vous exécutez le programme de la JRE du JDK (avec lecacerts
où le certificat est importé) est utilisé et non pas une autre JRE installé sur votre machine. UtilisationSystem.getProperty("java.runtime.version")
pour vérifier si c'est réellement le casSi vous utilisez Eclipse, il suffit de traverser vérifier dans Eclipse Windows--> préférences---->java---> installé Jre pointe du JRE courant et le JRE où vous avez configuré votre certificat. Si pas retirer le JRE et ajouter le jre où votre certificat est installé
Par votre pastebin, vous devez ajouter le
proxy.tkk.com
certificat pour le truststore.InstallCert
occupé de tout certificat de dépendances.HTTP 407
.Dans mon cas, le problème a été résolu par l'installation de Oracle JDK officiel 10 plutôt que d'utiliser la valeur par défaut OpenJDK qui est venu avec mon Ubuntu. C'est le guide, j'ai suivi: https://www.linuxuprising.com/2018/04/install-oracle-java-10-in-ubuntu-or.html
Sur Windows vous pouvez essayer ces étapes:
/lib/security
avec le JRE (vous pouvez utiliser un système comandSystem.out.println(System.getProperty("java.home");
pour trouver le dossier avec le JRE courant). Faire une copie de sauvegarde du fichier.