La résolution de javax.net.le protocole ssl.SSLHandshakeException: le soleil.de sécurité.programme de validation.ValidatorException: PKIX chemin de la construction d'Erreur échec?
Edit :- Essayé de formater la question et a accepté de répondre dans les plus présentable façon à la mine Blog
Ici, est le problème d'origine.
J'obtiens cette erreur:
message détaillé soleil.de sécurité.programme de validation.ValidatorException: PKIX chemin
bâtiment a échoué:
soleil.de sécurité.fournisseur de.certpath.SunCertPathBuilderException: impossible de
trouver la validité de la certification chemin demandé ciblecause javax.net.le protocole ssl.SSLHandshakeException:
soleil.de sécurité.programme de validation.ValidatorException: PKIX chemin de bâtiment
échec: le soleil.de sécurité.fournisseur de.certpath.SunCertPathBuilderException:
impossible de trouver le chemin de certification valide pour demandé cible
Je suis en utilisant Tomcat 6 en tant que serveur web. J'ai deux HTTPS applications web installées sur différents Matous sur des ports différents, mais sur la même machine. Dire App1(port 8443)
et
App2(port 443)
. App1
se connecte à App2
. Lorsque App1
se connecte à App2
j'obtiens l'erreur ci-dessus. Je sais que c'est une erreur très commune c'est à travers de nombreuses solutions sur différents forums et sites. J'ai le dessous de l'entrée en server.xml
de deux Matous:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Chaque site dit la même raison que le certificat donné par app2 n'est pas dans la confiance de magasin de app1 de la jvm. Cela semble être vrai aussi quand j'ai essayé de frapper la même URL dans le navigateur IE, ça fonctionne (avec le réchauffement, Il y a un problème avec ce site web de certificat de sécurité. Ici, je dis poursuivre sur ce site web). Mais quand même URL est frappé 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:
Option1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Option2
Le 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
Le 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 à travaillé pour la dernière fois est en cours d'exécution Java approche proposée dans Comment gérer les certificats SSL non valides avec Apache HttpClient? par Pascal Thivent c'est à dire l'exécution du programme InstallCert.
Mais cette approche est très bien pour devbox l'installation, mais je ne peux pas l'utiliser en environnement de production.
Je me demande
pourquoi trois approches mentionnées ci-dessus ne fonctionne pas lorsque j'ai mentionné les mêmes valeurs dans server.xml
de app2
serveur et les mêmes valeurs dans truststore par la mise en
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
dans app1
programme.
Pour plus d'informations, c'est la façon dont je dois faire le lien:
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());
- double possible de client http et SSL
- Odly assez j'ai eu cette erreur lors de la communication entre les serveurs en cluster qui n'avait pas de SSL problèmes individuellement. Une fois que j'ai correctement configuré
domainname
dans mes serveurs RHEL le problème avait disparu. Espérons que cela aide quelqu'un. - Une autre chose à vérifier est que vous avez la dernière version de Java j'ai été faire une erreur similaire à cause de cela.
- stackoverflow.com/questions/2893819/... - aussi pertinentes et une fantastique réponse.
Vous devez vous connecter pour publier un commentaire.
Vous devez ajouter le certificat pour App2 le fichier truststore de la JVM situé à
%JAVA_HOME%\lib\security\cacerts
.D'abord, vous pouvez vérifier si votre certificat est déjà dans le truststore 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 l'ajouter à la truststore avec la commande suivante:
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
Après l'importation, vous pouvez exécuter la première commande à nouveau pour vérifier si votre certificat a été ajouté.
Sun/Oracle d'informations peuvent être trouvées ici.
keytool error: java.io.FileNotFoundException ... (Access is denied)
lorsque vous essayez d'importer votre certificat.*.cert
filetype mais autant que je sache, la Java keytool n'est pas capricieux. Vous êtes libre de choisir n'importe quel nom pour laAliasName
. Comme un surnom, quelque chose comme "MyCert" ou "Bob l'éponge". Des acclamations.Certificate not imported, alias already exists
.• Lorsque j'ai eu l'erreur, j'ai essayé de Google le sens de l'expression et je l'ai trouvé, ce problème se produit lorsqu'un serveur changements de leurs HTTPS certificat SSL, et notre ancienne version de java ne reconnaît pas le certificat racine de l'autorité de certification (CA).
• Si vous pouvez accéder à l'URL HTTPS dans votre navigateur, puis il est possible de mettre à jour Java à reconnaître l'autorité de certification racine.
• Dans votre navigateur, accédez à l'URL HTTPS que Java n'a pas pu accéder. Cliquez sur le certificat HTTPS chaîne (il y a l'icône de verrouillage dans Internet Explorer), cliquez sur le verrou pour afficher le certificat.
• Aller dans “Détails” du certificat et de la “Copie de fichiers”. Le copier dans Base64 (.cer) format. Il sera enregistré sur votre Bureau.
• Installer le certificat ignorer toutes les alertes.
• C'est de cette façon que j'ai rassemblé les informations de certificat de l'URL que j'essayais d'accès.
Maintenant, j'ai dû faire ma version de java à savoir sur le certificat de sorte que de plus elle ne refuse pas de reconnaître l'URL. À cet égard, je dois dire que j'ai googlé que les informations sur le certificat racine de séjours par défaut dans le JDK est \jre\lib\security emplacement, et le mot de passe par défaut d'accès est: changeit.
Pour afficher le fichier cacerts informations suivantes sont les procédures à suivre:
• Cliquez sur le Bouton Démarrer-->Exécuter
• Tapez cmd. L'invite de commande s'ouvre (vous pouvez avoir besoin de l'ouvrir en tant qu'administrateur).
• Accédez à votre
Java/jreX/bin
répertoire• Tapez le texte suivant
Il donne la liste actuelle des certificats contenus dans le keystore. Il ressemble à quelque chose comme ceci:
• Maintenant, j'ai dû inclure précédemment installé certificat dans le fichier cacerts.
• Pour cela, voici la procédure:
Si vous utilisez Java 7:
• Il faudra ensuite ajouter les informations de certificat dans le fichier cacert.
C'est la solution que j'ai trouvé pour l'Exception mentionnée ci-dessus!!
Comment travailler-il dans Tomcat 7
Je voulais à l'appui d'un certificat auto-signé dans un Tomcat App mais l'extrait de code suivant ne fonctionne pas
c'est ce qui a résolu mon problème:
1) Télécharger le
.crt
fichier<your domain>
avec votre nom de domaine (par exemple,jossef.com
)2) Appliquer le
.crt
fichier en Javacacerts
magasin de certificats<your domain>
avec votre nom de domaine (par exemple,jossef.com
)<JAVA HOME>
avec votre répertoire d'accueil java3) le Pirater
Même si iv'e installé mon certificat en
Java
par défaut de certificat de magasins, Tomcat ignore que (on dirait que c'est pas configuré pour utiliser Java par défaut de magasins de certificats).De pirater cela, ajoutez la ligne suivante quelque part dans votre code:
Keystore was tampered with, or password was incorrect
erreur lors de l'importation de.crt
changeit
. voir stackoverflow.com/q/16891182/3191896Dans mon cas, le problème est que le serveur était seul envoi du certificat et de l'autorité de certification intermédiaire, pas de l'autorité de certification racine.
L'ajout de cette option JVM a résolu le problème:
-Dcom.sun.security.enableAIAcaIssuers=true
Source
Mon fichier cacerts était totalement vide. J'ai résolu ce problème en copiant le fichier cacerts hors de ma machine windows (c'est l'utilisation d'Oracle Java 7) et scp avais à ma boîte Linux (OpenJDK).
puis sur la machine linux
Qu'il a fonctionné très bien jusqu'à présent.
Une autre raison pourrait être une ancienne version de JDK. J'ai été en utilisant la version de jdk 1.8.0_60, il suffit de mettre à jour à la dernière version résolu le problème de la délivrance du certificat.
Pour moi, cette erreur est apparue trop tout en essayant de se connecter à un processus de derrière un reverse proxy NGINX qui est de la manipulation de la SSL.
Il s'est avéré que le problème était dû à un certificat sans l'ensemble de la chaîne de certificat concaténées.
Quand j'ai ajouté certificats intermédiaires, le problème a été résolu.
Espère que cette aide.
Utilisant Tomcat 7 sous Linux, cela a fait le tour.
Sous Linux,
$JAVA_HOME
n'est pas toujours de l'installation, mais généralement/etc/alternatives/jre
points de$JAVA_HOME/jre
Code ci-dessous fonctionne pour moi :
J'ai été en utilisant
jdk1.8.0_171
quand j'ai été confronté au même problème. J'ai essayé les 2 solutions (ajout d'un certificat à l'aide de keytool et une autre solution qui a un hack en elle), mais ils n'ont pas de travail pour moi.J'ai mis à jour mon JDK pour
1.8.0_181
et cela a fonctionné comme un charme.j'ai écrit un petit win32 (windows xp 32bit testet) stupide cmd (invite de commande) script qui recherche pour toutes les versions de java dans les fichiers de programme et ajoute un cert pour eux.
Le Mot de passe doit être la valeur par défaut "changeit" ou de modifier vous-même dans le script 🙂
Pour Tomcat en cours d'exécution sur le serveur Ubuntu, pour savoir quelle version de Java est utilisé, utilisez "ps -ef | grep tomcat de la commande":
Exemple:
Ensuite, nous pouvons aller à: cd /usr/local/java/jdk1.7.0_15/jre/lib/security
Par défaut cacerts fichier se trouve ici. Insérez le certificat non approuvé en elle.
J'ai ce problème aussi.
J'ai essayé presque tout en ajoutant le certificat SSL pour .fichier de stockage des clés, mais il ne fonctionnait pas avec Java1_6_x.
Pour moi, il a aidé si nous commençons à utiliser une version plus récente de Java, Java1_8_x comme JVM.
pour la sécurité, il ne faut pas utiliser les certificats auto-signés dans notre mise en œuvre. Cependant, quand il s'agit de développement souvent, nous devons utiliser la méthode d'essai des environnements qui s'est auto-signé certs. J'ai essayé de résoudre ce problème par programmation dans mon code et je ne. Cependant, en ajoutant le cert de la jre confiance magasin fixe mon problème. Veuillez trouver ci-dessous les étapes,
De télécharger le site cert,
Copie du certificat(ex:cert_file.cer) dans le répertoire $JAVA_HOME\Jre\Lib\Security
Ouvrir CMD en Administrateur et accédez au répertoire $JAVA_HOME\Jre\Lib\Security
Importer le certificat dans un magasin de confiance à l'aide de commande ci-dessous,
Si vous avez un message d'erreur indiquant que keytool n'est pas identifiable, veuillez consultez cette.
Type oui comme ci-dessous
Mise à jour
Si votre serveur d'application jboss, essayez d'ajouter ci-dessous du système de la propriété
Espérons que cette aide!
Pour MacOS X ci-dessous est la commande exacte qui a fonctionné pour moi, où j'ai dû essayer avec le double tiret dans 'importcert' option qui a travaillé :
Je rencontre ce problème à l'aide de
AndroidStudio
,Charles Proxy
,JUnit
etRobolectric
.Merci @SimonSez j'ai pu résoudre le problème.
%JAVA_HOME%
- Android utilise un autre JavaHome. Vous pouvez trouver un chemin d'accès complet dansUnitTests resulr
onglet. Dans mon cas, c'est/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home
Télécharger Charles de Certificat (par exemple,
Downloads
dossier)Exécutez la commande
sudo keytool -import -noprompt -trustcacerts -alias charles -file <path to Charles certificate.pem> -keystore "JAVA_HOME/jre/lib/security/cacerts" -storepass changeit
Par exemple
sudo keytool -import -noprompt -trustcacerts -alias charles -file ~/Downloads/charles-ssl-proxying-certificate.pem -keystore "/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts" -storepass changeit
L'officiel de Charles doc