web-dev-qa-db-fra.com

La construction du chemin PKIX a échoué dans une application Java

Cela fait presque une semaine que je lutte pour que mes applications soient opérationnelles après le transfert de mes applications de Windows 2000 à Windows 2008 R2 Server.

La procédure:

  1. JDK Java 1.7.0_25 installé
  2. Définissez la variable d'environnement système Java_HOME sur C:\Progra~1\Java\jdk1.7.0_25\
  3. Importé le certificat dans cacerts avec keytool
  4. Assurez-vous que le certificat existe dans keytool avec -list.

J'ai essayé de répéter step 3 avec InstallCert pour m'assurer que je n'ai rien foiré.

Les méthodes ci-dessus n'ont pas résolu mon problème, j'ai donc essayé de le faire par programme:

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 aucune chance. Je suis coincé et je ne sais pas trop quelle direction prendre à 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

METTRE À JOUR:

System.out.println(System.getProperty("javax.net.ssl.trustStore")); Et System.out.println(System.getProperty("javax.net.ssl.keyStore")); 

renvoie null.

33
JavaCake

J'ai rencontré des problèmes similaires dont la cause et la solution se sont révélées assez simples:

Cause principale: n'a pas importé le certificat approprié à l'aide de keytool 

_ {REMARQUE: importez uniquement les certificats de l'autorité de certification racine (ou vos propres certificats auto-signés)} _ 

REMARQUE: n'importez pas de certificat intermédiaire de chaîne de certificat autre qu'une chaîne de certificats}

Exemple de solution pour imap.gmail.com

  1. Déterminez le certificat de l'autorité de certification racine: 

    openssl s_client -showcerts -connect imap.gmail.com:993
    

    dans ce cas, l'autorité de certification racine est Autorité de certification Equifax Secure

  2. Télécharger racine CA cert .
  3. Vérifiez que le certificat téléchargé a les empreintes SHA-1 et/ou MD5 appropriées en comparant avec info trouvé ici
  4. Certificat d'importation pour javax.net.ssl.trustStore:

    keytool -import -alias gmail_imap -file Equifax_Secure_Certificate_Authority.pem
    
  5. Exécutez votre code Java 
31
jb1

Vous avez importé le certificat dans le fichier de clés certifiées du JRE fourni dans le JDK, mais vous exécutez le fichier Java.exe du JRE installé directement.

MODIFIER

Par souci de clarté et pour dissiper tout incompréhension dans le commentaire ci-dessous, vous devez importer le certificat dans le fichier cacertsde la JRE que vous souhaitez utiliser, et qui sera rarement, voire jamais, celui expédié à l'intérieur du JDK, car les clients n’ont normalement pas de JDK. Tout élément du commentaire ci-dessous suggérant le contraire doit être ignoré, car il n’exprime pas mon intention ici.

Une solution bien meilleure serait de créer votre magasin de clés de confiance own, en commençant par une copie du fichier cacerts, et d'indiquer spécifiquement à Java de l'utiliser via la propriété système javax.net.ssl.trustStore..

Vous devez créer cette partie de votre processus de construction afin de vous tenir au courant des modifications apportées au fichier cacerts provoquées par les mises à niveau de JDK.

9
user207421

Si vous utilisez Eclipse, vérifiez simplement dans Eclipse Windows -> préférences ----> Java ---> JRE installés pointe le JRE actuel et le JRE où vous avez configuré votre certificat. Si ce n'est pas supprimer le JRE et ajouter le jre où votre certificat est installé

3

Selon votre Pastebin, vous devez ajouter le certificat proxy.tkk.com au fichier de clés certifiées.

0
Sean Baker

Dans mon cas, le problème a été résolu en installant le JDK officiel 10 d'Oracle par opposition à l'utilisation du OpenJDK par défaut fourni avec Ubuntu. Voici le guide que j'ai suivi: https://www.linuxuprising.com/2018/04/install-Oracle-Java-10-in-ubuntu-or.html

0
acohen