Edit: - J'ai essayé de formater la question et accepté la réponse de manière plus présentable sur le mien Blog
Voici le numéro d'origine.
Je reçois cette erreur:
message détaillé sun.security.validator.ValidatorException: échec de la création du chemin PKIX:
sun.security.provider.certpath.SunCertPathBuilderException: impossible de trouver un chemin de certification valide vers la cible demandéecause javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: échec de la construction du chemin PKIX: sun.security.provider.certpath.SunCertPathBuilderException: impossible de trouver un chemin de certification valide vers la cible demandée
J'utilise Tomcat 6 comme serveur Web. J'ai deux applications Web HTTPS installées sur différents Tomcats sur différents ports mais sur la même machine. Dites App1(port 8443)
et
App2(port 443)
. App1
se connecte à App2
. Lorsque je me App1
connecte à, App2
j'obtiens l'erreur ci-dessus. Je sais que c'est une erreur très courante, j'ai trouvé de nombreuses solutions sur différents forums et sites. J'ai l'entrée ci-dessous dans les server.xml
deux Tomcats:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Chaque site indique la même raison pour laquelle le certificat donné par app2 ne se trouve pas dans le magasin de confiance de app1 jvm. Cela semble être vrai également lorsque j'ai essayé de frapper la même URL dans le navigateur IE, cela fonctionne (avec réchauffement, il y a un problème avec le certificat de sécurité de ce site Web. Ici, je dis continuer sur ce site). Mais lorsque la même URL est atteinte par le client Java (dans mon cas), j'obtiens l'erreur ci-dessus. Donc, pour le mettre dans le truststore, j'ai essayé ces trois options:
Option 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Option2 Réglage ci-dessous dans la variable d'environnement
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Option3 Réglage ci-dessous dans la variable d'environnement
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Mais rien n'a fonctionné .
Ce qui a finalement fonctionné est d'exécuter l'approche Java suggérée dans Comment gérer les certificats SSL invalides avec Apache HttpClient? par Pascal Thivent c'est-à-dire l'exécution du programme InstallCert.
Mais cette approche est très bien pour la configuration de devbox mais je ne peux pas l'utiliser dans un environnement de production.
Je me demande pourquoi trois approches mentionnées ci-dessus n'ont pas fonctionné alors que j'ai mentionné les mêmes valeurs dans server.xml
du app2
serveur et les mêmes valeurs dans truststore en définissant
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
dans le app1
programme.
Pour plus d'informations, voici comment je fais la connexion:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
domainname
mes serveurs RHEL, le problème a disparu. J'espère que cela aide quelqu'un.Réponses:
Vous devez ajouter le certificat pour App2 au fichier truststore de la machine virtuelle Java utilisée situé à
%JAVA_HOME%\lib\security\cacerts
.Vous pouvez d'abord vérifier si votre certificat est déjà dans le magasin de clés de confiance en exécutant la commande suivante:
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"
(vous n'avez pas besoin de fournir un mot de passe)Si votre certificat est manquant, vous pouvez l'obtenir en le téléchargeant avec votre navigateur et en l'ajoutant au magasin de clés de confiance avec la commande suivante:
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
Après l'importation, vous pouvez réexécuter la première commande pour vérifier si votre certificat a été ajouté.
Les informations Sun / Oracle peuvent être trouvées ici .
la source
keytool error: java.io.FileNotFoundException ... (Access is denied)
lorsque vous essayez d'importer votre certificat.• Lorsque j'ai eu l'erreur, j'ai essayé de rechercher la signification de l'expression sur Google et j'ai trouvé que ce problème se produit lorsqu'un serveur modifie son certificat SSL HTTPS et que notre ancienne version de java ne reconnaît pas l'autorité de certification racine (CA) .
• Si vous pouvez accéder à l'URL HTTPS dans votre navigateur, il est possible de mettre à jour Java pour reconnaître l'autorité de certification racine.
• Dans votre navigateur, accédez à l'URL HTTPS à laquelle Java n'a pas pu accéder. Cliquez sur la chaîne de certificats HTTPS (il y a une icône de verrouillage dans Internet Explorer), cliquez sur le verrou pour afficher le certificat.
• Allez dans «Détails» du certificat et «Copier dans un fichier». Copiez-le dans format Base64 (.cer) . Il sera enregistré sur votre bureau.
• Installez le certificat en ignorant toutes les alertes.
• Voici comment j'ai rassemblé les informations de certificat de l'URL à laquelle j'essayais d'accéder.
Maintenant, je devais faire ma version java pour connaître le certificat afin qu'il ne refuse plus de reconnaître l'URL. À cet égard, je dois mentionner que j'ai recherché sur Google que les informations du certificat racine restent par défaut dans la sécurité \ jre \ lib \ de JDK. emplacement , et le mot de passe par défaut pour accéder est: changeit.
Pour afficher les informations sur les cacerts, voici les procédures à suivre:
• Cliquez sur le bouton Démarrer -> Exécuter
• Tapez cmd. L'invite de commande s'ouvre (vous devrez peut-être l'ouvrir en tant qu'administrateur).
• Accédez à votre
Java/jreX/bin
répertoire• Tapez ce qui suit
Il donne la liste des certificats actuels contenus dans le magasin de clés. Cela ressemble à ceci:
• Maintenant, je devais inclure le certificat précédemment installé dans les cacerts.
• Pour cela, voici la procédure:
Si vous utilisez Java 7:
• Il ajoutera ensuite les informations du certificat dans le fichier cacert.
C'est la solution que j'ai trouvée pour l'exception mentionnée ci-dessus !!
la source
Comment travailler avec Tomcat 7
Je voulais prendre en charge un certificat auto-signé dans une application Tomcat, mais l'extrait de code suivant n'a pas fonctionné
c'est ce qui a résolu mon problème:
1) Téléchargez le
.crt
fichier<your domain>
par votre domaine (par exemplejossef.com
)2) Appliquer le
.crt
fichier dans lecacerts
magasin de certificats Java<your domain>
par votre domaine (par exemplejossef.com
)<JAVA HOME>
par votre répertoire personnel java3) Hack it
Même si iv'e a installé mon certificat dans
Java
les magasins de certificats par défaut de, Tomcat l'ignore (il semble qu'il ne soit pas configuré pour utiliser les magasins de certificats par défaut de Java).Pour pirater cela, ajoutez ce qui suit quelque part dans votre code:
la source
Dans mon cas, le problème était que le serveur Web envoyait uniquement le certificat et l'autorité de certification intermédiaire, pas l'autorité de certification racine. L'ajout de cette option JVM a résolu le problème:
-Dcom.sun.security.enableAIAcaIssuers=true
La source
la source
Une autre raison pourrait être une version obsolète de JDK. J'utilisais la version 1.8.0_60 de jdk, la simple mise à jour vers la dernière version a résolu le problème du certificat.
la source
Mon fichier cacerts était totalement vide. J'ai résolu cela en copiant le fichier cacerts sur ma machine Windows (qui utilise Oracle Java 7) et je l'ai scpé dans ma boîte Linux (OpenJDK).
puis sur la machine linux
Cela a très bien fonctionné jusqu'à présent.
la source
Pour moi, cette erreur est également apparue lors de la tentative de connexion à un processus derrière un proxy inverse NGINX qui gérait le SSL.
Il s'est avéré que le problème était un certificat sans que toute la chaîne de certificats soit concaténée. Lorsque j'ai ajouté des certificats intermédiaires, le problème a été résolu.
J'espère que cela t'aides.
la source
En utilisant Tomcat 7 sous Linux, cela a fait l'affaire.
Sous Linux,
$JAVA_HOME
n'est pas toujours configuré, mais/etc/alternatives/jre
indique généralement$JAVA_HOME/jre
la source
Le code ci-dessous fonctionne pour moi:
la source
J'utilisais
jdk1.8.0_171
quand j'ai fait face au même problème. J'ai essayé les 2 meilleures solutions ici (en ajoutant un certificat en utilisant keytool et une autre solution qui a un hack), mais elles n'ont pas fonctionné pour moi.J'ai amélioré mon JDK
1.8.0_181
et cela a fonctionné comme un charme.la source
j'ai écrit un petit script stupide cm32 (ligne de commande) win32 (WinXP 32bit testet) qui recherche toutes les versions de java dans les fichiers programme et leur ajoute un certificat. Le mot de passe doit être le "changeit" par défaut ou le changer vous-même dans le script :-)
la source
Pour MacOS X ci-dessous, la commande exacte a fonctionné pour moi où j'ai dû essayer avec double hypen dans l'option 'importcert' qui fonctionnait:
la source
Pour moi, la solution reconnue de ce post n'a pas fonctionné: https://stackoverflow.com/a/9619478/4507034 .
Au lieu de cela, j'ai réussi à résoudre le problème en important la certification dans les certifications de confiance de ma machine.
Pas:
https://localhost:8443/yourpath
) où la certification ne fonctionne pas.Manage computer certificates
Trusted Root Certification Authorities
->Certificates
your_certification_name.cer
fichier.la source
Pour Tomcat fonctionnant sur le serveur Ubuntu, pour savoir quel Java est utilisé, utilisez la commande "ps -ef | grep tomcat":
Échantillon:
Ensuite, nous pouvons aller dans: cd /usr/local/java/jdk1.7.0_15/jre/lib/security
Le fichier cacerts par défaut se trouve ici. Insérez-y le certificat non approuvé.
la source
pour des raisons de sécurité, nous ne devons pas utiliser de certificats auto-signés dans notre implémentation. Cependant, en ce qui concerne le développement, nous devons souvent utiliser des environnements d'essai avec des certificats auto-signés. J'ai essayé de résoudre ce problème par programme dans mon code et j'échoue. Cependant, en ajoutant le certificat au magasin de confiance jre, j'ai résolu mon problème. Veuillez trouver ci-dessous les étapes,
Téléchargez le site cert,
Copiez le certificat (ex: cert_file.cer) dans le répertoire $ JAVA_HOME \ Jre \ Lib \ Security
Ouvrez CMD dans Administrateur et changez le répertoire en $ JAVA_HOME \ Jre \ Lib \ Security
Importez le certificat dans un magasin de clés certifiées à l'aide de la commande ci-dessous,
Si vous avez une erreur indiquant que keytool n'est pas reconnaissable, veuillez vous référer à ceci.
Tapez oui comme ci-dessous
Mise à jour
Si votre serveur d'applications est jboss, essayez d'ajouter la propriété système ci-dessous
J'espère que cela t'aides!
la source
SOLUTION DÉPLOYABLE (Alpine Linux)
Pour pouvoir résoudre ce problème dans nos environnements d'application, nous avons préparé les commandes de terminal Linux comme suit:
Générera un fichier cert dans le répertoire personnel.
Cette commande installe openssl sous Linux alpin. Vous pouvez trouver des commandes appropriées pour d'autres distributions Linux.
Généré le fichier cert nécessaire.
Appliqué le fichier généré au JRE avec le programme 'keytool'.
Remarque: veuillez remplacer votre DNS par
<host-dns-ssl-belongs>
Remarque 2: veuillez noter doucement que
-noprompt
le message de vérification ne sera pas invité (oui / non) et que le-storepass changeit
paramètre désactivera l'invite de mot de passe et fournira le mot de passe requis (la valeur par défaut est 'changeit'). Ces deux propriétés vous permettront d'utiliser ces scripts dans vos environnements d'application comme la construction d'une image Docker.Remarque3 Si vous déployez votre application via Docker, vous pouvez générer le fichier secret une fois et le placer dans vos fichiers de projet d'application. Vous n'aurez pas besoin de le générer encore et encore.
la source
J'ai aussi ce problème.
J'ai essayé presque tout en ajoutant le certificat SSL à .keystore, mais cela ne fonctionnait pas avec Java1_6_x. Pour moi, cela a aidé si nous commençons à utiliser une version plus récente de Java, Java1_8_x comme JVM.
la source
J'avais ce problème avec Android Studio lorsque je suis derrière un proxy. J'utilisais Crashlytics qui essaie de télécharger le fichier de mappage lors d'une génération.
J'ai ajouté le certificat proxy manquant au magasin de confiance situé à l'adresse
/Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts
avec la commande suivante:
keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]
par exemple avec le mot de passe truststore par défaut
keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt
la source
Juste un petit hack. Mettez à jour l'URL dans le fichier "hudson.model.UpdateCenter.xml" de https à http
la source
Je veux jouer car j'ai un environnement QEMU où je dois télécharger des fichiers en java. Il s'avère que
/etc/ssl/certs/java/cacerts
dans QEMU a un problème car il ne correspond pas au/etc/ssl/certs/java/cacerts
à l'environnement hôte. L'environnement hôte est derrière un proxy d'entreprise, donc les cacerts java sont une version personnalisée.Si vous utilisez un environnement QEMU, assurez-vous que le système hôte peut d'abord accéder aux fichiers. Par exemple, vous pouvez essayer ce script sur votre machine hôte. Si le script fonctionne très bien sur la machine hôte mais pas dans QEMU, alors vous rencontrez le même problème que moi.
Pour résoudre ce problème, j'ai dû faire une sauvegarde du fichier d'origine dans QEMU, copier le fichier dans l'environnement hôte vers la prison de chroot QEMU, puis java pouvait télécharger des fichiers normalement dans QEMU.
Une meilleure solution serait de monter le
/etc
dans l'environnement QEMU; cependant, je ne sais pas si d'autres fichiers seront impactés dans ce processus. J'ai donc décidé d'utiliser cette solution de contournement laide mais facile.la source
Cela semble être un bon endroit pour documenter une autre raison possible du fameux message d'erreur PKIX. Après avoir passé beaucoup trop de temps à regarder le contenu du magasin de clés et du magasin de clés de confiance et diverses configurations d'installation Java, j'ai réalisé que mon problème était dû à ... une faute de frappe.
La faute de frappe signifiait que j'utilisais également le magasin de clés comme magasin de confiance. Comme l'autorité racine de mon entreprise n'était pas définie comme un certificat autonome dans le magasin de clés, mais uniquement comme faisant partie d'une chaîne de certificats, et n'était définie nulle part ailleurs (c.-à-d. Cacerts), je continuais à recevoir l'erreur PKIX.
Après une sortie ratée (c'est la config prod, c'était ok ailleurs) et deux jours de gratte tête j'ai enfin vu la faute de frappe, et maintenant tout va bien.
J'espère que cela aide quelqu'un.
la source
ajoutez ceci à votre code:
la source