Risoluzione javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed Errore?


Answers

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Creazione del percorso PKIX non riuscita: sun.security.provider.certpath.SunCertPathBuilderException: impossibile trovare il percorso di certificazione valido per il target richiesto

• Quando ho ricevuto l'errore, ho provato a Google il significato dell'espressione e ho scoperto che questo problema si verifica quando un server modifica il proprio certificato SSL HTTPS e la nostra versione precedente di java non riconosce l'autorità di certificazione radice (CA) .

• Se è possibile accedere all'URL HTTPS nel browser, è possibile aggiornare Java per riconoscere la CA principale.

• Nel tuo browser, vai all'URL HTTPS a cui Java non poteva accedere. Fare clic sulla catena di certificati HTTPS (c'è l'icona di blocco in Internet Explorer), fare clic sul lucchetto per visualizzare il certificato.

• Andare su "Dettagli" del certificato e "Copia su file". Copialo nel formato Base64 (.cer) . Sarà salvato sul tuo desktop.

• Installare il certificato ignorando tutti gli avvisi.

• In questo modo ho raccolto le informazioni sul certificato dell'URL che stavo cercando di accedere.

Ora dovevo fare in modo che la mia versione java fosse a conoscenza del certificato, in modo che non rifiutasse di riconoscere l'URL. A questo proposito, devo menzionare che ho cercato su Google che le informazioni del certificato di root siano mantenute per impostazione predefinita nel percorso di sicurezza di JDK \ jre \ lib \ e che la password di accesso predefinita sia: changeit.

Per visualizzare le informazioni sui cachi, seguire le seguenti procedure:

• Fare clic sul pulsante Start -> Esegui

• Digitare cmd. Si apre il prompt dei comandi (potrebbe essere necessario aprirlo come amministratore).

• Vai alla tua directory Java/jreX/bin

• Digitare quanto segue

keytool -list -keystore D: \ Java \ jdk1.5.0_12 \ jre \ lib \ security \ cacerts

Fornisce l'elenco dei certificati correnti contenuti nel keystore. Sembra qualcosa del genere:

C: \ Documents and Settings \ NeelanjanaG> keytool -list -keystore D: \ Java \ jdk1.5.0_12 \ jre \ lib \ security \ cacerts

Inserire la password del keystore: changeit

Tipo di keystore: jks

Provider di keystore: SUN

Il tuo keystore contiene 44 voci

verisignclass3g2ca, 26 marzo 2004, trustedCertEntry,

Certificato fingerprint (MD5): A2: 33: 9B: 4C: 74: 78: 73: D4: 6C: E7: C1: F3: 8D: CB: 5C: E9

entrustclientca, 9 gen 2003, trustedCertEntry,

Certificato fingerprint (MD5): 0C: 41: 2F: 13: 5B: A0: 54: F5: 96: 66: 2D: 7E: CD: 0E: 03: F4

thawtepersonalbasicca, 13 febbraio 1999, trustedCertEntry,

Impronta digitale certificato (MD5): E6: 0B: D2: C9: CA: 2D: 88: DB: 1A: 71: 0E: 4B: 78: EB: 02: 41

addtrustclass1ca, 1 maggio 2006, trustedCertEntry,

Certificato di impronte digitali (MD5): 1E: 42: 95: 02: 33: 92: 6B: B9: 5F: C0: 7F: DA: D6: B2: 4B: FC

verisignclass2g3ca, 26 marzo 2004, trustedCertEntry,

Certificato di impronte digitali (MD5): F8: BE: C4: 63: 22: C9: A8: 46: 74: 8B: B8: 1D: 1E: 4A: 2B: F6

• Ora dovevo includere il certificato precedentemente installato nei cacerts.

• Per questo è la procedura seguente:

keytool -import -noprompt -trustcacerts -alias ALIASNAME -file FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass PASSWORD

Se stai usando Java 7:

keytool -importcert -trustcacerts -alias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass changeit

• Aggiungerà quindi le informazioni sul certificato nel file cacert.

È la soluzione che ho trovato per l'eccezione di cui sopra !!

Question

Modifica: - Ho cercato di formattare la domanda e ho accettato la risposta in modo più presentabile sul mio Blog

Ecco il problema originale: -

Sto ottenendo questo errore

messaggio dettagliato sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: impossibile trovare il percorso di certificazione valido per la destinazione richiesta

causa javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: costruzione del percorso PKIX non riuscita: sun.security.provider.certpath.SunCertPathBuilderException: impossibile trovare il percorso di certificazione valido per la destinazione richiesta

sto usando Tomcat 6 come server web. Ho due webbapplication https installati su diversi tomcat su porte differenti ma sullo stesso computer. Dì App1(port 8443) e App2(port 443) . App1 connette a App2 . Quando App1 connette a App2 i ottengo sopra l'errore. So che questo è un errore molto comune quindi ho trovato molte soluzioni su diversi forum e siti. Ho sotto voce in server.xml di entrambi tomcat ie

keystoreFile="c:/.keystore" 
keystorePass="changeit"

Ogni sito dice la stessa ragione per cui il certificato fornito da app2 non si trova nell'archivio di fiducia di app1 jvm. Questo sembra essere vero anche quando sono stanco di raggiungere lo stesso URL nel browser IE, funziona (con il riscaldamento, C'è un problema con il certificato di sicurezza di questo sito Web. Qui dico continuare a questo sito) Ma quando lo stesso URL viene colpito da client java (nel mio caso). Quindi ottengo l'errore di cui sopra. Quindi, per farla affidamento, ho provato queste opzioni ad albero, ad es

Opzione 1

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Opzione2 Impostazione in basso nella variabile d'ambiente

CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

Opzione3 Impostazione in basso nella variabile d'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 i certificati SSL non validi con Apache HttpClient? da Pascal Thivent cioè eseguendo il programma InstallCert.

Ma questo approccio va bene per l'installazione di Devbox ma non posso usarlo in ambiente di produzione.

Mi chiedo perché i tre approcci menzionati sopra non funzionino quando ho menzionato gli stessi valori in server.xml del server app2 e gli stessi valori nel truststore impostando

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

nel programma app1 .

Per ulteriori informazioni questo è come sto facendo 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());



Per Tomcat in esecuzione sul server Ubuntu, per scoprire quale Java viene utilizzato, utilizzare il comando "ps -ef | grep tomcat":

Campione:

/home/mcp01$ **ps -ef |grep tomcat**
tomcat7  28477     1  0 10:59 ?        00:00:18 **/usr/local/java/jdk1.7.0_15/bin/java** -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.awt.headless=true -Xmx512m -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
1005     28567 28131  0 11:34 pts/1    00:00:00 grep --color=auto tomcat

Quindi, possiamo andare a: cd /usr/local/java/jdk1.7.0_15/jre/lib/security

Il file cacerts predefinito si trova qui. Inserisci il certificato non affidabile in esso.




Ho scritto un piccolo script win32 (WinXP a 32 bit) stupido cmd (riga di comando) che cerca tutte le versioni java nei file di programma e aggiunge loro un certificato. La password deve essere l'impostazione predefinita "changeit" o modificarla autonomamente nello script :-)

@echo off

for /F  %%d in ('dir /B %ProgramFiles%\java') do (
    %ProgramFiles%\Java\%%d\bin\keytool.exe -import -noprompt -trustcacerts -file some-exported-cert-saved-as.crt -keystore %ProgramFiles%\Java\%%d\lib\security\cacerts -storepass changeit
)

pause



Il mio file cacerts era completamente vuoto. Ho risolto questo problema copiando il file cacerts dalla mia macchina Windows (che utilizza Oracle Java 7) e lo ho scp'd nella mia box Linux (OpenJDK).

cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp

e poi sulla macchina Linux

cp /tmp/cacerts /etc/ssl/certs/java/cacerts

Ha funzionato alla grande finora.