Modifica: - Ho provato a formattare la domanda e ho accettato la risposta in modo più presentabile sul mio Blog
Ecco il problema originale.
Ricevo questo errore:
messaggio dettagliato sun.security.validator.ValidatorException: creazione del percorso PKIX non riuscita:
sun.security.provider.certpath.SunCertPathBuilderException: impossibile trovare un percorso di certificazione valido per la destinazione richiestacausa javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: creazione del percorso PKIX non riuscita: sun.security.provider.certpath.SunCertPathBuilderException: impossibile trovare un percorso di certificazione valido per la destinazione richiesta
Sto usando Tomcat 6 come webserver. Ho due applicazioni Web HTTPS installate su TomCat diversi su porte diverse ma sulla stessa macchina. Dì App1(port 8443)
e
App2(port 443)
. App1
si connette a App2
. Quando si App1
collega a App2
ottengo l'errore sopra. So che questo è un errore molto comune, quindi ho riscontrato molte soluzioni su forum e siti diversi. Ho la seguente voce in server.xml
entrambi i Tomcat:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Ogni sito indica lo stesso motivo per cui il certificato fornito da app2 non si trova nell'archivio attendibile di app1 jvm. Questo sembra essere vero anche quando ho provato a colpire lo stesso URL nel browser IE, funziona (con il riscaldamento, c'è un problema con il certificato di sicurezza di questo sito Web. Qui dico continua a questo sito Web). Ma quando lo stesso URL viene colpito dal client Java (nel mio caso) ottengo l'errore sopra. Quindi per metterlo nel truststore ho provato queste tre opzioni:
Opzione 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Opzione2 Impostazione di seguito nella variabile di ambiente
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Opzione 3 Impostazione di seguito nella variabile di ambiente
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Ma niente ha funzionato .
Ciò che alla fine ha funzionato è l'esecuzione dell'approccio Java suggerito in Come gestire certificati SSL non validi con Apache HttpClient? di Pascal Thivent, ovvero eseguendo il programma InstallCert.
Ma questo approccio va bene per l'installazione di devbox ma non posso usarlo nell'ambiente di produzione.
Mi chiedo il motivo per cui tre approcci sopra citati non hanno lavoro, quando ho menzionato gli stessi valori in server.xml
dei app2
valori del server e le stesse in truststore dall'impostazione
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
in app1
programma.
Per ulteriori informazioni, ecco come sto effettuando la connessione:
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
nei miei server RHEL il problema era sparito. Spero che aiuti qualcuno.