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.