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:
Java_HOME
sur C:\Progra~1\Java\jdk1.7.0_25\
keytool
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
.
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
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
Certificat d'importation pour javax.net.ssl.trustStore
:
keytool -import -alias gmail_imap -file Equifax_Secure_Certificate_Authority.pem
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 cacerts
de 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.
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é
Selon votre Pastebin, vous devez ajouter le certificat proxy.tkk.com
au fichier de clés certifiées.
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