"Échec de la construction du chemin PKIX" et " impossible de trouver le chemin de certification valide vers la cible demandée"
J'essaie d'obtenir des tweets en utilisant twitter4j bibliothèque pour mon projet java. Lors de ma première exécution, j'ai eu une erreur sur certificate sun.security.validator.ValidatorException
et sun.security.provider.certpath.SunCertPathBuilderException
. Puis j'ai ajouté le certificat twitter par:
C:Program FilesJavajdk1.7.0_45jrelibsecurity>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:Program FilesJavajdk1.7.0_45jrelibsecuritycacerts"
Mais sans succès. Voici la procédure pour obtenir twitters:
public static void main(String[] args) throws TwitterException {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("myConsumerKey")
.setOAuthConsumerSecret("myConsumerSecret")
.setOAuthAccessToken("myAccessToken")
.setOAuthAccessTokenSecret("myAccessTokenSecret");
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
try {
Query query = new Query("iphone");
QueryResult result;
result = twitter.search(query);
System.out.println("Total amount of tweets: " + result.getTweets().size());
List<Status> tweets = result.getTweets();
for (Status tweet : tweets) {
System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
}
} catch (TwitterException te) {
te.printStackTrace();
System.out.println("Failed to search tweets: " + te.getMessage());
}
Et voici l'erreur:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
http://www.google.co.jp/search?q=d35baff5 or
http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
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
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
... 5 more
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(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
... 20 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
... 26 more
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
21 réponses
-
Allez à L'URL dans votre navigateur firefox, cliquez sur la chaîne de certificats HTTPS (à côté de L'adresse URL). Cliquez sur
"more info" > "security" > "show certificate" > "details" > "export.."
. Ramassez le nom et choisissez l'exemple de type de fichier.la cer. Maintenant, vous avez un fichier avec keystore et vous devez l'ajouter à votre JVM Déterminer l'emplacement des fichiers cacerts, par exemple.
C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.
-
Ensuite, importez le fichier
example.cer
dans cacerts en ligne de commande:
keytool -import -alias example -keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts -file example.cer
On vous demandera le mot de passe par défaut changeit
Redémarrer votre JVM / PC.
Source: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html
Après de nombreuses heures à essayer de créer des fichiers cert pour que mon installation Java 6 fonctionne avec les nouveaux certificats twitter, je suis finalement tombé sur une solution incroyablement simple enfouie dans un commentaire dans l'un des forums. Copiez simplement le fichier cacerts à partir d'une installation Java 7 et écrasez celui de votre installation Java 6. Probablement préférable de faire une sauvegarde du fichier cacerts d'abord, mais vous venez de copier le nouveau et BOOM! il fonctionne, tout simplement.
Notez que j'ai effectivement copié un Windows fichier cacerts sur une installation Linux et cela a très bien fonctionné.
Le fichier se trouve dans jre/lib/security/cacerts
dans les anciennes et nouvelles installations Java JDK.
J'espère que cela sauve quelqu'un d'autre des heures d'aggravation.
Je suis tombé sur ce problème qui a pris de nombreuses heures de recherche à résoudre, spécialement avec les certificats générés automatiquement, qui contrairement aux certificats officiels, sont assez difficiles et Java ne les aime pas beaucoup.
Veuillez vérifier le lien suivant: résoudre le problème avec les certificats en Java
Fondamentalement, vous devez ajouter le certificat du serveur Aux Certificats Java Home.
- générez ou obtenez votre certificat et configurez Tomcat pour l'utiliser dans Serveur.xml
- Téléchargez le code source Java de la classe
InstallCert
et exécutez-le pendant l'exécution du serveur, en fournissant les arguments suivantsserver[:port]
. Aucun mot de passe n'est nécessaire, car le mot de passe d'origine fonctionne pour les certificats Java ("changeit"). - le programme se connectera au serveur et Java lancera une exception, il analysera le certificat fourni par le serveur et vous permettra de créer un fichier
jssecerts
dans le répertoire où vous avez exécuté le programme (S'il est exécuté à partir de Eclipse assurez-vous ensuite de configurer le répertoire de travail dansRun -> Configurations
). - copiez manuellement ce fichier dans
$JAVA_HOME/jre/lib/security
Après avoir suivi ces étapes, les connexions avec le certificat ne généreront plus d'exceptions dans Java.
Le code source suivant est important et il a disparu des blogs (Sun) Oracle, la seule page que je l'ai trouvée était sur le lien fourni, donc je l'attache dans la réponse pour toute référence.
/*
* Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Sun Microsystems nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* Originally from:
* http://blogs.sun.com/andreas/resource/InstallCert.java
* Use:
* java InstallCert hostname
* Example:
*% java InstallCert ecc.fedora.redhat.com
*/
import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* Class used to add the server's certificate to the KeyStore
* with your trusted certificates.
*/
public class InstallCert {
public static void main(String[] args) throws Exception {
String host;
int port;
char[] passphrase;
if ((args.length == 1) || (args.length == 2)) {
String[] c = args[0].split(":");
host = c[0];
port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
String p = (args.length == 1) ? "changeit" : args[1];
passphrase = p.toCharArray();
} else {
System.out.println("Usage: java InstallCert [:port] [passphrase]");
return;
}
File file = new File("jssecacerts");
if (file.isFile() == false) {
char SEP = File.separatorChar;
File dir = new File(System.getProperty("java.home") + SEP
+ "lib" + SEP + "security");
file = new File(dir, "jssecacerts");
if (file.isFile() == false) {
file = new File(dir, "cacerts");
}
}
System.out.println("Loading KeyStore " + file + "...");
InputStream in = new FileInputStream(file);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(in, passphrase);
in.close();
SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
context.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory factory = context.getSocketFactory();
System.out.println("Opening connection to " + host + ":" + port + "...");
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.setSoTimeout(10000);
try {
System.out.println("Starting SSL handshake...");
socket.startHandshake();
socket.close();
System.out.println();
System.out.println("No errors, certificate is already trusted");
} catch (SSLException e) {
System.out.println();
e.printStackTrace(System.out);
}
X509Certificate[] chain = tm.chain;
if (chain == null) {
System.out.println("Could not obtain server certificate chain");
return;
}
BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
System.out.println();
System.out.println("Server sent " + chain.length + " certificate(s):");
System.out.println();
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
MessageDigest md5 = MessageDigest.getInstance("MD5");
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i];
System.out.println
(" " + (i + 1) + " Subject " + cert.getSubjectDN());
System.out.println(" Issuer " + cert.getIssuerDN());
sha1.update(cert.getEncoded());
System.out.println(" sha1 " + toHexString(sha1.digest()));
md5.update(cert.getEncoded());
System.out.println(" md5 " + toHexString(md5.digest()));
System.out.println();
}
System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
String line = reader.readLine().trim();
int k;
try {
k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
} catch (NumberFormatException e) {
System.out.println("KeyStore not changed");
return;
}
X509Certificate cert = chain[k];
String alias = host + "-" + (k + 1);
ks.setCertificateEntry(alias, cert);
OutputStream out = new FileOutputStream("jssecacerts");
ks.store(out, passphrase);
out.close();
System.out.println();
System.out.println(cert);
System.out.println();
System.out.println
("Added certificate to keystore 'jssecacerts' using alias '"
+ alias + "'");
}
private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
private static String toHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 3);
for (int b : bytes) {
b &= 0xff;
sb.append(HEXDIGITS[b >> 4]);
sb.append(HEXDIGITS[b & 15]);
sb.append(' ');
}
return sb.toString();
}
private static class SavingTrustManager implements X509TrustManager {
private final X509TrustManager tm;
private X509Certificate[] chain;
SavingTrustManager(X509TrustManager tm) {
this.tm = tm;
}
public X509Certificate[] getAcceptedIssuers() {
throw new UnsupportedOperationException();
}
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
throw new UnsupportedOperationException();
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
this.chain = chain;
tm.checkServerTrusted(chain, authType);
}
}
}
Mon approche UI:
- Télécharger http://www.keystore-explorer.org/
- Ouvrir $ JAVA_HOME/jre/lib / security / cacerts
- Entrez PW: changeit (peut être changeme sur Mac)
- importer votre .fichier crt
Cmd-ligne:
- keytool -importcert -fichier de la jetée.crt-alias jetty-keystore $ JAVA_HOME/jre/lib / security / cacerts
- Entrez PW: changeit (peut être changeme sur Mac)
J'ai eu une situation légèrement différente, quand JDK et jre 1.8.0_112 étaient présents sur mon système.
J'ai importé les nouveaux certificats D'autorité de certification dans [JDK_FOLDER]\jre\lib\security\cacerts
en utilisant la commande déjà connue:
keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>
Pourtant, j'ai continué à obtenir la même erreur PKIX path building failed.
J'ai ajouté des informations de débogage à la CLI java, en utilisant java -Djavax.net.debug=all ... > debug.log
. Dans le débogage.fichier journal, la ligne qui commence par trustStore est: en fait pointé vers le magasin cacerts trouvé dans [JRE_FOLDER]\lib\security\cacerts
.
Dans mon cas, la solution était de copier le fichier cacerts utilisé par JDK (qui avait le nouveau CAs ajouté) sur celui utilisé par le JRE et qui a résolu le problème.
Je voulais importer un certificat pour smtp.gmail.com
Seule solution a fonctionné pour moi est 1. Entrez la commande pour afficher ce certificat
D:\openssl\bin\openssl.exe s_client-connect smtp. gmail. com: 465
Copiez et enregistrez les lignes entre "- - - - - BEGIN CERTIFICATE - - - - - " et "- - - - - END CERTIFICATE - - - - - " dans un fichier, gmail.cer
-
Exécuter
Keytool-import-alias smtp.gmail.com -keystore "%JAVA_HOME % /jre/lib/security/cacerts" -fichier C:\Users\Admin\Desktop\gmail.cer
-
Entrez le mot de passe chageit
Cliquez sur oui pour importer le certificat
Redémarrez java
Maintenant, exécutez la commande et vous êtes prêt à partir
1. Vérifier le certificat
Essayez de charger L'URL cible dans le navigateur et d'afficher le certificat du site (généralement accessible par l'icône avec le signe de verrouillage. C'est sur le côté gauche ou droit de la barre d'adresse du navigateur) qu'il soit expiré ou non approuvé pour une autre raison.
2. Installer les dernières versions de JRE et JDK
Les nouvelles versions viennent généralement avec l'ensemble mis à jour des certificats de confiance.
Aussi, si c'est possible, désinstallez les anciennes versions. Cela va faire erreurs de configuration explicites.
3. Vérifiez votre configuration:
- Vérifiez où pointe votre variable D'environnement JAVA_HOME.
- vérifiez quelle version java vous utilisez pour exécuter le programme. Dans IntelliJ vérifier:
- Fichier - > Structure Du Projet... - >Paramètres du projet - > Projet - > SDK du projet:
- Fichier - > Structure Du Projet... - >Paramètres De La Plate-Forme - > SDK
4. Copiez le keystore entier à partir de la nouvelle version de Java
Si vous développer sous le JDK autre que le dernier disponible-essayez de remplacer le fichier %JAVA_HOME%/jre/lib/security/cacerts
par le nouveau du dernier JRE installé (faites d'abord une copie de sauvegarde) comme le suggère @ jeremy-goodell dans sa réponse
5. Ajouter des certificats à votre keystore
Si rien ci-dessus ne résout votre problème, utilisez keytool
pour enregistrer le(s) certificat (s) dans le keystore de Java:
keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>
Fichier avec le certificat peut être obtenu à partir du navigateur comme @MagGGG suggère dans son réponse.
Note 1: vous devrez peut-être répéter ceci pour chaque certificat de la chaîne au certificat de votre site. Commencez à partir de la racine.
Remarque 2: <alias_name>
doit être unique parmi les clés dans le magasin ou keytool
affichera une erreur.
Pour obtenir la liste de tous les certificats dans le magasin, vous pouvez exécuter:
keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit
En cas de problème, cela vous aidera à supprimer le certificat du magasin:
keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
Il est utilisé pour sauter la validation du certificat.
Contexte Du Problème:
Je recevais une erreur suivante lorsque j'essaie d'exécuter mvn clean install dans mon projet et via Netbeans IDE clean et build option. Ce problème est dû au certificat non disponible lorsque nous téléchargeons via NET beans IDE / via l'invite de commande, mais capable de télécharger les fichiers via le navigateur.
Erreur:
Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact com.java.project:product:jar:1.0.32 from/to repo-local (https://url/local-repo): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Résolution:
1. Télécharger le certificat de l'Url question:
- Lancez IE par "exécuter en tant qu'administrateur" (sinon, nous ne pourrons pas télécharger le certificat)
- Entrez l'url dans IE-> https://url/local-repo (Dans mon cas, cette url est un certificat non approuvé.)
- Téléchargez le certificat en cliquant sur erreur de certificat - > afficher le certificat
- sélectionnez l'onglet Détails - > Copier dans un fichier - > suivant - > sélectionnez " DER encoded Binary X. 509 (.CER)
- enregistrez le certificat dans certains emplacement, exemple : c:/user/sheldon/desktop/product.cer
- , Félicitations! vous avez téléchargé avec succès le certificat pour le site
2. Installez maintenant le magasin de clés pour résoudre le problème.
- exécutez la commande keytool pour ajouter le fichier de clés téléchargé fichier de certificat existant.
- Commande: commande ci-dessous dans le dossier bin de JDK (JAVA_HOME) .
C:\Program fichiers\Java \ jdk1.8. 0_141\jre\bin>keytool - importcert-fichier "C:/user/sheldon/desktop/product.cer" -alias produit -keystore "C:/Program fichiers/Java/jdk1.8.0_141/jre/lib/security / cacerts".
- vous serez invité à entrer le mot de passe. Entrez le mot de passe keystore: entrez" changeit "à nouveau pour" faire confiance à ce certificat? [non]:", entrez "oui"
Exemple de commandes de ligne de commande / Sortie:
keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Enter keystore password:
Trust this certificate? [no]: yes
Certificate was added to keystore
- Contgrats! maintenant, vous auriez dû vous débarrasser de " PKIX path building failed: soleil.sécurité.Fournisseur.certpath.SunCertPathBuilderException " erreur dans votre IDE Netbeans.
Ce N'est pas une réponse spécifique à Twitter, mais c'est la question qui se pose lorsque vous recherchez cette erreur. Si votre système reçoit cette erreur lors de la connexion à un site web qui semble avoir un certificat valide lorsqu'il est affiché dans un navigateur web, cela signifie probablement que ce site Web a une chaîne de certificats incomplète.
Pour un bref résumé du problème: les autorités de certification n'utilisent pas leur certificat racine pour signer n'importe quel ancien certificat. Au lieu de cela, ils (habituellement) signer certificats intermédiaires qui ont également le drapeau de L'Autorité de certification défini (c'est-à-dire, sont autorisés à signer des certificats). Ensuite, lorsque vous achetez un certificat auprès d'une autorité de certification, elle signe votre CSR avec l'un de ces certificats intermédiaires.
Votre magasin de confiance Java n'a probablement que le certificat racine, pas les certificats intermédiaires.
Un site mal configuré peut renvoyer juste leur certificat signé. Problème: il a été signé avec un certificat intermédiaire qui n'est pas dans votre magasin de confiance. Les navigateurs vont gérer ce problème en téléchargeant ou en utilisant un certificat intermédiaire mis en cache; cela maximise la compatibilité du site web. Java et des outils comme OpenSSL, cependant, ne le seront pas. et cela provoquera l'erreur dans la question.
Vous pouvez vérifier ce soupçon en utilisant le Qualys SSL Test . Si vous exécutez cela contre un site et il dit
La chaîne de certificats de ce serveur est incomplète.
Alors ça le confirme. Vous pouvez également voir ceci en regardant les chemins de certification et en voyant le texte téléchargement supplémentaire .
Comment le réparer: l'administrateur du serveur doit configurer le serveur web pour qu'il renvoie également les certificats intermédiaires. Pour Comodo, par exemple, c'est là que le fichier .ca-bundle
est utile. Par exemple, dans une configuration Apache avec mod_ssl, vous utiliserez le paramètre de configuration SSLCertificateChainFile
. Pour nginx, vous devez concaténer les certificats intermédiaires et le certificat signé et l'utiliser dans le Configuration SSL cert. Vous pouvez trouver plus en recherchant" chaîne de certificat incomplète " en ligne.
Je suis tombé sur cette question en essayant d'installer le plugin Cucumber-Eclipse dans Eclipse via leur site de mise à jour. J'ai reçu la même erreur SunCertPathBuilderException:
Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Bien que certaines des autres réponses soient appropriées et utiles pour la situation donnée à cette question, elles étaient néanmoins inutiles et trompeuses pour mon problème.
Dans mon cas, le problème était que l'URL fournie pour leur site de mise à jour est:
Cependant, lorsque vous y naviguez via un navigateur, il a redirigé vers (notez l'ajout de " .github"):
La résolution est donc d'utiliser simplement la version redirigée de l'URL du site de mise à jour lors de l'ajout du site de mise à jour dans eclipse.
Ajouter cacerts
n'a pas fonctionné pour moi.
Après avoir activé le journal avec le drapeau -Djavax.net.debug=all
, puis est venu à connaître la lecture de java à partir de jssecacerts
.
Importer dans jssecacerts
a finalement fonctionné.
Normalement, ce type d'exception se produit lorsqu'il y a une discordance dans le chemin du certificat de confiance. Vérifiez la configuration ou le chemin d'accès où ce certificat de serveur est requis pour une communication sécurisée.
J'ai le même problème sur ubuntu 15.10. Veuillez essayer de télécharger le plugin localement, par exemple https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip et installer avec cette commande:
sudo /usr/share/elasticsearch/bin/plugin install file:/home/dev/Downloads/elasticsearch-kopf-master.zip
Chemin peut être différent en fonction de votre environnement.
Cordialement.
Pour moi, une erreur de certificat est apparue parce que j'avais fiddler en arrière-plan et que cela gâche le certificat. Il agit comme un proxy si proche et redémarre eclipse.
Je faisais face au même problème et le résolvais en utilisant les étapes simples ci-dessous:
1) Téléchargez InstallCert.java de google
2) compilez-le en utilisant javac InstallCert.java
3) Exécutez InstallCert.java utilisant Java InstallCert.java , avec le nom d'hôte et le port https, et appuyez sur " 1 " lorsque vous demandez une entrée. Il va ajouter le "localhost" en tant que keystore de confiance, et générer un fichier nommé "jssecacerts" comme ci-dessous:
Java InstallCert localhost:443
4) Copiez les jssecacerts dans le dossier $ JAVA_HOME/jre/lib/security
La source principale pour résoudre le problème ici est:
Https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html
Cordialement,
Ankur
C'est un ajout à la réponse https://stackoverflow.com/a/36427118/1491414 . Merci @ MagGGG
- assurez-vous D'avoir la permission de l'administrateur
- veuillez utiliser des guillemets doubles pour le chemin de keystore (- keystore C:\Program Files (x86)\Java\jre1. 6. 0_22\ lib \ security \ cacerts") car dans le système D'exploitation Windows, l'emplacement d'installation par défaut sera Program Files et vous obtiendrez une erreur en raison de l'espace entre les fichiers du programme.
J'ai corrigé cela en utilisant la méthode ci-dessous -
- Copiez l'url qui a un problème de connexion
- accédez à Android Studio->Paramètres - > Paramètres Http
- dans' Test Connection', collez cette url et appuyez sur ok
- sur OK cliquez, Android Studio vous demandera d'importer le certificat de ce url, importez-le
- C'est ça. Rien d'autre à faire et mon problème avait disparu. Pas besoin de redémarrez studio.
Lorsque vous avez une erreur ci-dessus avec atlassian software ex. jira
2018-08-18 11:35:00,312 Caesium-1-4 WARN anonymous Default Mail Handler [c.a.mail.incoming.mailfetcherservice] Default Mail Handler[10001]: javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while connecting to host 'imap.xyz.pl' as user 'jira@xyz.pl' via protocol 'imaps, 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
Vous pouvez ajouter des certs à son keystore de confiance (changez missing_ca en nom de cert approprié):
keytool -importcert -file missing_ca.crt -alias missing_ca -keystore /opt/atlassian/jira/jre/lib/security/cacerts
Si vous lui demandez le mot de passe, mettez changeit
et confirmez y
Après cela, redémarrez simplement jira.
La raison pour laquelle nous obtenons une erreur ci-dessus est que JDK est fourni avec beaucoup de certificats d'Autorité de certification(CA) de confiance dans un fichier appelé ‘cacerts’ mais ce fichier n'a aucune idée de notre certificat auto-signé. En d'autres termes, le fichier cacerts n'a pas notre certificat auto-signé importé et ne le traite donc pas comme une entité de confiance et donne donc l'erreur ci-dessus.
Comment réparer l'erreur ci-dessus
Pour corriger l'erreur ci-dessus, tous nous avons besoin est d'importer l'auto-signé certificat dans le fichier cacerts.
Tout d'abord, localisez le fichier cacerts. Nous devrons trouver L'emplacement du JDK. Si vous exécutez votre application via L'un des IDE comme Eclipse ou IntelliJ Idea, accédez aux paramètres du projet et déterminez quel est l'emplacement JDK. Par exemple, sur un Mac OS, l'emplacement typique du fichier cacerts serait à cet emplacement /Library / Java / JavaVirtualMachines / {{JDK_version}} / Contents/Home / jre / lib / security sur la machine D'une fenêtre il serait sous {{Dossier_d'installation}}/{{JDK_version}}/jre/lib/security
Une fois que vous avez localisé le fichier cacerts, nous devons maintenant importer notre certificat auto-signé dans ce fichier cacerts. Vérifiez le dernier article, si vous ne savez pas comment générer le certificat auto-signé correctement.
Si vous n'avez pas de fichier de certificat(.crt) et avoir juste un .fichier JKS vous pouvez générer un .fichier crt en utilisant la commande ci-dessous. Dans le cas où vous possédez déjà un .CRT/.fichier pem alors vous pouvez ignorer ci-dessous commande
# # pour générer un certificat à partir du magasin de clés (.fichier jks) ## # #
keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt
Étape ci-Dessus va générer un fichier appelé autosignés.CRT.Maintenant, importez le certificat dans cacerts
Maintenant, ajoutez le certificat à JRE / lib / security / cacerts (trustore)keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}
Maintenant, ajoutez le certificat à JRE / lib / security / cacerts (trustore)
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}
Par exemple
keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts
C'est tout, redémarrez votre application et cela devrait fonctionner correctement. Si cela ne fonctionne toujours pas et obtenez une exception de handshake SSL. C'est probablement signifie que vous utilisez un domaine différent puis enregistré dans le certificat.
Le lien avec une explication détaillée et une résolution étape par étape est ici.
Objectifs:
- utiliser les connexions https
- Vérifier les chaînes SSL
- ne pas traiter avec cacerts
- Ajouter un certificat dans l'exécution
- Ne perdez pas les certificats de cacerts
Comment le faire:
- définir son propre magasin de clés
- Mettre le certificat dans keystore
- redéfinissez le contexte par défaut SSL avec notre classe personnalisée
- ???
- bénéfice
Mon fichier wrapper Keystore:
public class CertificateManager {
private final static Logger logger = Logger.getLogger(CertificateManager.class);
private String keyStoreLocation;
private String keyStorePassword;
private X509TrustManager myTrustManager;
private static KeyStore myTrustStore;
public CertificateManager(String keyStoreLocation, String keyStorePassword) throws Exception {
this.keyStoreLocation = keyStoreLocation;
this.keyStorePassword = keyStorePassword;
myTrustStore = createKeyStore(keyStoreLocation, keyStorePassword);
}
public void addCustomCertificate(String certFileName, String certificateAlias)
throws Exception {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore) null);
Certificate certificate = myTrustStore.getCertificate(certificateAlias);
if (certificate == null) {
logger.info("Certificate not exists");
addCertificate(certFileName, certificateAlias);
} else {
logger.info("Certificate exists");
}
tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(myTrustStore);
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
setMytrustManager((X509TrustManager) tm);
logger.info("Trust manager found");
break;
}
}
}
private InputStream fullStream(String fname) throws IOException {
ClassLoader classLoader = getClass().getClassLoader();
InputStream resource = classLoader.getResourceAsStream(fname);
try {
if (resource != null) {
DataInputStream dis = new DataInputStream(resource);
byte[] bytes = new byte[dis.available()];
dis.readFully(bytes);
return new ByteArrayInputStream(bytes);
} else {
logger.info("resource not found");
}
} catch (Exception e) {
logger.error("exception in certificate fetching as resource", e);
}
return null;
}
public static KeyStore createKeyStore(String keystore, String pass) throws Exception {
try {
InputStream in = CertificateManager.class.getClass().getResourceAsStream(keystore);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(in, pass.toCharArray());
logger.info("Keystore was created from resource file");
return keyStore;
} catch (Exception e) {
logger.info("Fail to create keystore from resource file");
}
File file = new File(keystore);
KeyStore keyStore = KeyStore.getInstance("JKS");
if (file.exists()) {
keyStore.load(new FileInputStream(file), pass.toCharArray());
logger.info("Default keystore loaded");
} else {
keyStore.load(null, null);
keyStore.store(new FileOutputStream(file), pass.toCharArray());
logger.info("New keystore created");
}
return keyStore;
}
private void addCertificate(String certFileName, String certificateAlias) throws CertificateException,
IOException, KeyStoreException, NoSuchAlgorithmException {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream certStream = fullStream(certFileName);
Certificate certs = cf.generateCertificate(certStream);
myTrustStore.setCertificateEntry(certificateAlias, certs);
FileOutputStream out = new FileOutputStream(getKeyStoreLocation());
myTrustStore.store(out, getKeyStorePassword().toCharArray());
out.close();
logger.info("Certificate pushed");
}
public String getKeyStoreLocation() {
return keyStoreLocation;
}
public String getKeyStorePassword() {
return keyStorePassword;
}
public X509TrustManager getMytrustManager() {
return myTrustManager;
}
public void setMytrustManager(X509TrustManager myTrustManager) {
this.myTrustManager = myTrustManager;
}
}
Cette classe va créer keystore si nécessaire, et sera en mesure de gérer des certificats à l'intérieur. Maintenant classe pour le contexte SSL:
public class CustomTrustManager implements X509TrustManager {
private final static Logger logger = Logger.getLogger(CertificateManager.class);
private static SSLSocketFactory socketFactory;
private static CustomTrustManager instance = new CustomTrustManager();
private static List<CertificateManager> register = new ArrayList<>();
public static CustomTrustManager getInstance() {
return instance;
}
private X509TrustManager defaultTm;
public void register(CertificateManager certificateManager) {
for(CertificateManager manager : register) {
if(manager == certificateManager) {
logger.info("Certificate manager already registered");
return;
}
}
register.add(certificateManager);
logger.info("New Certificate manager registered");
}
private CustomTrustManager() {
try {
String algorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);
tmf.init((KeyStore) null);
boolean found = false;
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
defaultTm = (X509TrustManager) tm;
found = true;
break;
}
}
if(found) {
logger.info("Default trust manager found");
} else {
logger.warn("Default trust manager was not found");
}
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{this}, null);
SSLContext.setDefault(sslContext);
socketFactory = sslContext.getSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
logger.info("Custom trust manager was set");
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
logger.warn("Custom trust manager can't be set");
e.printStackTrace();
}
}
@Override
public X509Certificate[] getAcceptedIssuers() {
List<X509Certificate> out = new ArrayList<>();
if (defaultTm != null) {
out.addAll(Arrays.asList(defaultTm.getAcceptedIssuers()));
}
int defaultCount = out.size();
logger.info("Default trust manager contain " + defaultCount + " certficates");
for(CertificateManager manager : register) {
X509TrustManager customTrustManager = manager.getMytrustManager();
X509Certificate[] issuers = customTrustManager.getAcceptedIssuers();
out.addAll(Arrays.asList(issuers));
}
logger.info("Custom trust managers contain " + (out.size() - defaultCount) + " certficates");
X509Certificate[] arrayOut = new X509Certificate[out.size()];
return out.toArray(arrayOut);
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
for(CertificateManager certificateManager : register) {
X509TrustManager customTrustManager = certificateManager.getMytrustManager();
try {
customTrustManager.checkServerTrusted(chain, authType);
logger.info("Certificate chain (server) was aproved by custom trust manager");
return;
} catch (Exception e) {
}
}
if (defaultTm != null) {
defaultTm.checkServerTrusted(chain, authType);
logger.info("Certificate chain (server) was aproved by default trust manager");
} else {
logger.info("Certificate chain (server) was rejected");
throw new CertificateException("Can't check server trusted certificate.");
}
}
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
try {
if (defaultTm != null) {
defaultTm.checkClientTrusted(chain, authType);
logger.info("Certificate chain (client) was aproved by default trust manager");
} else {
throw new NullPointerException();
}
} catch (Exception e) {
for(CertificateManager certificateManager : register) {
X509TrustManager customTrustManager = certificateManager.getMytrustManager();
try {
customTrustManager.checkClientTrusted(chain, authType);
logger.info("Certificate chain (client) was aproved by custom trust manager");
return;
} catch (Exception e1) {
}
}
logger.info("Certificate chain (client) was rejected");
throw new CertificateException("Can't check client trusted certificate.");
}
}
public SSLSocketFactory getSocketFactory() {
return socketFactory;
}
}
Cette classe fait comme singleton, car un seul contexte defaultSSL autorisé. Donc, maintenant utilisation:
CertificateManager certificateManager = new CertificateManager("C:\\myapplication\\mykeystore.jks", "changeit");
String certificatePath = "C:\\myapplication\\public_key_for_your_ssl_service.crt";
try {
certificateManager.addCustomCertificate(certificatePath, "alias_for_public_key_for_your_ssl_service");
} catch (Exception e) {
log.error("Can't add custom certificate");
e.printStackTrace();
}
CustomTrustManager.getInstance().register(certificateManager);
Peut-être, cela ne fonctionnera pas avec ces paramètres, car je garde le fichier de certificat dans le dossier de ressources, donc mon chemin n'est pas absolu. Mais en général, il fonctionne parfaitement.