Risoluzione di javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: creazione del percorso PKIX non riuscita Errore?


426

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 richiesta

causa 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). App1si connette a App2. Quando si App1collega a App2ottengo 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.xmlentrambi 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.xmldei app2valori 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 app1programma.

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());

possibile duplicato di HttpClient e SSL
Marchese di Lorne il

Abbastanza stranamente ho avuto questo errore durante la comunicazione tra server cluster che non avevano problemi SSL individualmente. Una volta impostato correttamente domainnamenei miei server RHEL il problema era sparito. Spero che aiuti qualcuno.
DavidG,

Un'altra cosa da verificare è che tu abbia l'ultima versione di Java - stavo ottenendo un errore simile a causa di questo.
Redzarf,

stackoverflow.com/questions/2893819/… - anche pertinente e una risposta fantastica.
Siddhartha,

Risposte:


406

Devi aggiungere il certificato per App2 al file truststore della JVM usata che si trova in%JAVA_HOME%\lib\security\cacerts .

Per prima cosa puoi verificare se il tuo certificato è già nel truststore eseguendo il seguente comando: keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"(non è necessario fornire una password)

Se il certificato non è presente, puoi ottenerlo scaricandolo con il browser e aggiungendolo al truststore con il seguente comando:

keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>

Dopo l'importazione è possibile eseguire nuovamente il primo comando per verificare se il certificato è stato aggiunto.

Le informazioni su Sun / Oracle sono disponibili qui .


6
Dovrai utilizzare il percorso completo, ad esempio c: \ java \ jdk \ lib \ security \ cacerts
SimonSez

48
Come ha detto SimonSez, non è necessaria una password, ma se lo si desidera, la password predefinita è "changeit".
Felix

16
Inoltre, in Windows è necessario eseguire il terminale come amministratore, altrimenti si ottiene l'errore keytool error: java.io.FileNotFoundException ... (Access is denied)quando si tenta di importare il certificato.
Felix,

2
Ah @SimonSez sei il mio dio. Ma per aggiungerlo, è necessario specificare la posizione e la password del truststore come indicato da @M Sach per farlo funzionare.
BudsNanKis,

2
Continua ad avere problemi con Java 1.8. Necessario aggiungere cert come descritto e usare Java <1.8
Tom Howard

180

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

• Quando ho ricevuto l'errore, ho provato a Google a capire il significato dell'espressione e ho riscontrato che questo problema si verifica quando un server modifica il 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 browser, vai all'URL HTTPS a cui Java non ha potuto accedere. Fare clic sulla catena di certificati HTTPS (è presente l'icona di blocco in Internet Explorer), fare clic sul blocco per visualizzare il certificato.

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

• Installa il certificato ignorando tutti gli avvisi.

• Ecco come ho raccolto le informazioni sul certificato dell'URL a cui stavo tentando di accedere.

Ora ho dovuto fare in modo che la mia versione java venisse a conoscenza del certificato in modo che non si rifiutasse di riconoscere l'URL. A questo proposito, devo dire che ho cercato su Google che le informazioni sul certificato di root rimangono di default nella posizione di sicurezza \ jre \ lib \ di JDK e la password predefinita per accedere è: changeit.

Per visualizzare le informazioni sui dessert sono 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 Java/jreX/bindirectory

• 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

Inserisci la password del keystore: changeit

Tipo di archivio chiavi: jks

Fornitore di keystore: SUN

Il tuo keystore contiene 44 voci

verisignclass3g2ca, 26 mar 2004, trustedCertEntry,

Impronta digitale del certificato (MD5): A2: 33: 9B: 4C: 74: 78: 73: D4: 6C: E7: C1: F3: 8D: CB: 5C: E9

entrustclientca, 9 gennaio 2003, trustedCertEntry,

Impronta digitale del certificato (MD5): 0C: 41: 2F: 13: 5B: A0: 54: F5: 96: 66: 2D: 7E: CD: 0E: 03: F4

thawtepersonalbasicca, 13 febbraio 1999, trustedCertEntry,

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

addtrustclass1ca, 1 maggio 2006, trustedCertEntry,

Impronta digitale del certificato (MD5): 1E: 42: 95: 02: 33: 92: 6B: B9: 5F: C0: 7F: DA: D6: B2: 4B: FC

verisignclass2g3ca, 26 mar 2004, trustedCertEntry,

Impronta digitale del certificato (MD5): F8: BE: C4: 63: 22: C9: A8: 46: 74: 8B: B8: 1D: 1E: 4A: 2B: F6

• Ora ho dovuto includere il certificato precedentemente installato nei dessert.

• Per questo è la seguente procedura:

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

Se si utilizza Java 7:

keytool –importcert –trustcacerts –alias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -scambio passaggio

• Quindi aggiungerà le informazioni sul certificato nel file cacert.

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


5
Cosa fai alla scadenza del certificato? Ripeti tutto (annualmente)?
ggkmath,

7
C'è un modo per farlo programmaticamente?
Meshulam Silk

1
Per le persone che hanno a che fare con l'errore PKIX, "Path non si collega a nessuno degli ancoraggi di fiducia", questa soluzione non mi ha purtroppo risolto il problema.
IcedDante,

3
Una domanda: aliasName è l'indirizzo Web per il quale stiamo importando il certificato? Ad esempio, se l'URL è domain.site.com/pages/service.asmx, allora dovrebbe essere alias domain.site.com o URL completo (domain.site.com/pages/service.asmx) o dovrebbe anche avere il prefisso http : // o è solo un nome arbitrario?
nanosoft,

1
percorso: \ lib \ security> keytool -import -noprompt -trustcacerts -alias webCert -file webCertResource.cer -keystore c: / Users / Jackie / Desktop -storepass changeit Ottengo "il sistema non trova il file specificato"
Jesse

46

Come lavorarlo in Tomcat 7

Volevo supportare un certificato autofirmato in un'app Tomcat ma il seguente frammento non funzionava

import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HTTPSPlayground {
    public static void main(String[] args) throws Exception {

        URL url = new URL("https:// ... .com");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        httpURLConnection.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());

        String serializedMessage = "{}";
        wr.writeBytes(serializedMessage);
        wr.flush();
        wr.close();

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println(responseCode);
    }
}

questo è ciò che ha risolto il mio problema:

1) Scarica il .crtfile

echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
  • sostituisci <your domain>con il tuo dominio (ad es. jossef.com)

2) Applicare il .crtfile nell'archivio cacertscertificati di Java

keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
  • sostituisci <your domain>con il tuo dominio (ad es. jossef.com)
  • sostituisci <JAVA HOME>con la tua home directory java

3) Hack it

Anche se ho installato il mio certificato negli archivi certificati Javapredefiniti, Tomcat lo ignora (sembra che non sia configurato per utilizzare gli archivi certificati predefiniti di Java).

Per hackerarlo, aggiungi quanto segue da qualche parte nel tuo codice:

String certificatesTrustStorePath = "<JAVA HOME>/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);

// ...

4
Il passaggio 2 mi ha aiutato a utilizzare SpringBoot e Tomcat 7. Grazie.
Tim Perry,

Devo usare il keytool di Java che viene utilizzato da Tomcat? Perché su un server posso avere molti java
vikifor

@vikifor si. Puoi anche eseguirlo per tutte le directory Java installate sul tuo sistema
Jossef Harush

1
Questo ha funzionato! grazie mille @JossefHarush per una risposta così utile!
Tom Taylor,

1
il mio problema è stato risolto dopo aver aggiunto il segmento di codice di @Jossef Harush nel mio codice.
Chamod Pathirana,

10

Nel mio caso il problema era che il server web stava solo inviando il certificato e la CA intermedia, non la CA principale. L'aggiunta di questa opzione JVM ha risolto il problema:-Dcom.sun.security.enableAIAcaIssuers=true

È disponibile il supporto per il metodo di accesso caIssuers dell'estensione Accesso informazioni autorità. È disabilitato per impostazione predefinita per la compatibilità e può essere abilitato impostando la proprietà di sistema com.sun.security.enableAIAcaIssuerssul valore true.

Se impostato su true, l'implementazione PKIX di Sun di CertPathBuilder utilizza le informazioni nell'estensione AIA di un certificato (oltre ai CertStores specificati) per trovare il certificato CA di emissione, a condizione che si tratti di un URI di tipo ldap, http o ftp.

fonte


Questo in realtà ha risolto il mio problema, grazie!
Luís Silva,

6

Un altro motivo potrebbe essere una versione obsoleta di JDK. Stavo usando la versione 1.8.0_60 di jdk, semplicemente aggiornando all'ultima versione risolto il problema del certificato.


2
Ho avuto anche lo stesso problema. La chiamata di un'API con un certificato Lets Encrypt potrebbe non funzionare con le versioni precedenti di Java perché non è riconosciuta dalle autorità di certificazione radice attendibili. L'aggiornamento di Java risolverà questo problema.
hertg,

5

Il mio file Cacerts era completamente vuoto. Ho risolto questo problema copiando il file Cacerts dal mio computer Windows (che sta utilizzando Oracle Java 7) e l'ho scpato sul mio Linux box (OpenJDK).

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

e poi sulla macchina linux

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

Finora ha funzionato benissimo.


1
Funziona meravigliosamente se il problema è che stai usando una versione precedente di Java che non ha i certificati più recenti.
atripathi,

@atripathi che ne dici di un Mac?
iOSAndroidWindowsMobileAppsDev

Si è verificato un errore grave nell'installazione di Java se il file cacerts era vuoto. Avresti dovuto reinstallarlo tutto.
Marchese di Lorne,

Forse, ma questa soluzione ha funzionato e nulla è mai stato sbagliato dopo.
Ryan Shillington,

5

Per me, questo errore è apparso anche durante il tentativo di connettersi a un processo dietro un proxy inverso NGINX che stava gestendo SSL.

Si è scoperto che il problema era un certificato senza l'intera catena di certificati concatenata. Quando ho aggiunto certificati intermedi, il problema è stato risolto.

Spero che sia di aiuto.


sembra quello che sto avendo. puoi spiegare come hai aggiunto i certificati intermedi e dove. sto usando httpd reverse proxy e non NGINX.
Asaf Magen,

questo mi ha aiutato nel mio caso perché sto
Asaf Magen

Con nginx, utilizza solo file .key e .pem per la configurazione SSL. Prima converti .crt in .pem (semplicemente: cp yourfile.crt yourfile.pem) e poi per la catena di certificati SSL: aggiungi il file .cer all'ultimo di .pem (cat yourfile.cer >> yourfile.pem)
Thh Anh Nguyễn,

5

Utilizzando Tomcat 7 sotto Linux, questo ha funzionato.

String certificatesTrustStorePath = "/etc/alternatives/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Sotto Linux, $JAVA_HOMEnon è sempre configurato, ma di solito /etc/alternatives/jrepunta a$JAVA_HOME/jre


5

Di seguito il codice funziona per me:

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class TrustAnyTrustManager implements X509TrustManager {

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
}

HttpsURLConnection conn = null;
            URL url = new URL(serviceUrl);
            conn = (HttpsURLConnection) url.openConnection();
             SSLContext sc = SSLContext.getInstance("SSL");  
             sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());  

             conn.setSSLSocketFactory(sc.getSocketFactory());

5
Questo codice è totalmente insicuro e non deve essere utilizzato.
Marchese di Lorne,

@ user207421 Perché non è sicuro? Cosa sta succedendo nel codice brevemente.
Govinda Sakhare,

Questo salta tutte le convalide dei certificati, in pratica consente di accettare qualsiasi certificato. Il modo in cui funzionano i certificati è che esiste un certificato radice (letteralmente) protetto fisicamente, presso varie autorità di certificazione. Questo certificato viene quindi utilizzato per rilasciare altri certificati secondari, che possono essere convalidati fino all'autorità di certificazione radice. Questo sta saltando tutti i controlli a monte, il che significa che posso inviare qualsiasi certificato SSL (anche auto-generato) e la tua applicazione lo accetterà come sicura, anche se la mia identità come url non è verificata.
Scott Taylor,

4

Stavo usando jdk1.8.0_171quando ho affrontato lo stesso problema. Ho provato qui le prime 2 soluzioni (aggiungendo un certificato usando keytool e un'altra soluzione che ha un trucco) ma non hanno funzionato per me.

Ho aggiornato il mio JDK 1.8.0_181e ha funzionato come un fascino.


2

ho scritto un piccolo stupido script cmd (commandline) win32 (testX Winbit 32bit) che cerca tutte le versioni java nei file di programma e aggiunge un certificato ad esse. La password deve essere il "changeit" predefinito o cambiarlo tu stesso 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

2

Per MacOS X sotto è il comando esatto che ha funzionato per me dove ho dovuto provare con double hypen nell'opzione 'importcert' che ha funzionato:

sudo keytool -–importcert -file /PathTo/YourCertFileDownloadedFromBrowserLockIcon.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/security/cacerts -alias "Cert" -storepass changeit

2

Per me non ha funzionato la soluzione riconosciuta da questo post: https://stackoverflow.com/a/9619478/4507034 .

Invece, sono riuscito a risolvere il problema importando la certificazione sulla mia macchina certificazioni affidabili.

passi:

  1. Vai all'URL (es. https://localhost:8443/yourpath) In cui la certificazione non funziona.
  2. Esporta la certificazione come descritto nel post citato.
  3. Sulla tua macchina Windows aperta: Manage computer certificates
  4. Vai a Trusted Root Certification Authorities->Certificates
  5. Importa qui il tuo your_certification_name.cerfile.

1

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 accedere a: cd /usr/local/java/jdk1.7.0_15/jre/lib/security

Il file cacerts predefinito si trova qui. Inserire il certificato non attendibile al suo interno.


1

per sicurezza non dovremmo usare certificati autofirmati nella nostra implementazione. Tuttavia, quando si tratta di sviluppo spesso dobbiamo usare ambienti di prova che hanno certificati autofirmati. Ho provato a risolvere questo problema a livello di codice nel mio codice e non riesco. Tuttavia, aggiungendo il certificato al Trust Store di jre ho risolto il mio problema. Di seguito sono riportati i passaggi,

  1. Scarica il sito cert,

  2. Copia il certificato (es: cert_file.cer) nella directory $ JAVA_HOME \ Jre \ Lib \ Security

  3. Aprire CMD in Amministratore e modificare la directory in $ JAVA_HOME \ Jre \ Lib \ Security

  4. Importa il certificato in un truststore utilizzando il comando seguente,

keytool -import -alias ca -file cert_file.cer -keystore cacerts -storepass changeit

Se viene visualizzato un errore che indica che Keytool non è riconoscibile, fare riferimento a questo.

Digita come di seguito

Fidati di questo certificato: [Sì]

  1. Ora prova a eseguire il codice o accedi all'URL a livello di codice utilizzando Java.

Aggiornare

Se il tuo server delle app è jboss, prova ad aggiungere sotto la proprietà di sistema

System.setProperty("org.jboss.security.ignoreHttpsHost","true");

Spero che sia di aiuto!


1

SOLUZIONE DEPLOYABLE (Alpine Linux)

Per poter risolvere questo problema nei nostri ambienti applicativi, abbiamo preparato i comandi del terminale Linux come segue:

cd ~

Genererà il file cert nella home directory.

apk add openssl

Questo comando installa openssl in alpine Linux. È possibile trovare i comandi appropriati per altre distribuzioni Linux.

openssl s_client -connect <host-dns-ssl-belongs> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt

Generato il file di certificato necessario.

sudo $JAVA_HOME/bin/keytool -import -alias server_name -keystore $JAVA_HOME/lib/security/cacerts -file public.crt -storepass changeit -noprompt

Applicato il file generato a JRE con il programma 'keytool'.

Nota: sostituire il DNS con<host-dns-ssl-belongs>

Nota2: tenere presente che -nopromptnon verrà richiesto il messaggio di verifica (sì / no) e il -storepass changeitparametro disabiliterà la richiesta della password e fornirà la password necessaria (l'impostazione predefinita è "changeit"). Queste due proprietà ti permetteranno di usare quegli script nei tuoi ambienti applicativi come costruire un'immagine Docker.

Nota3 Se si sta distribuendo l'app tramite Docker, è possibile generare una volta il file segreto e inserirlo nei file di progetto dell'applicazione. Non sarà necessario generarlo ancora e ancora.


0

Anch'io ho questo problema.

Ho provato quasi tutto aggiungendo il certificato SSL a .keystore, ma non funzionava con Java1_6_x. Per me è stato d'aiuto se iniziamo a utilizzare la versione più recente di Java, Java1_8_x come JVM.


1
Stessa cosa per me. Un aggiornamento da Java 1.8.0_91 a 1.8.0_121 ha risolto il problema. Ho ottenuto l'eccezione utilizzando Apache HTTPClient.
Devabc,

Ho ancora questo problema con l'autenticazione Oauth2
Sofiane,

0

Stavo avendo questo problema con Android Studio quando sono dietro un proxy. Stavo usando Crashlytics che tenta di caricare il file di mappatura durante una build.

Ho aggiunto il certificato proxy mancante al truststore situato in /Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts

con il seguente comando: keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]

ad esempio con la password truststore predefinita keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt


0

Solo un piccolo trucco. Aggiorna l'URL nel file "hudson.model.UpdateCenter.xml" da https a http

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://updates.jenkins.io/update-center.json</url>
  </site>
</sites>

0

Voglio entrare perché ho un ambiente QEMU in cui devo scaricare file in Java. Si scopre che /etc/ssl/certs/java/cacertsin QEMU non ha problemi perché non corrisponde a/etc/ssl/certs/java/cacerts all'ambiente host. L'ambiente host è protetto da un proxy aziendale, quindi Java Cacerts è una versione personalizzata.

Se si utilizza un ambiente QEMU, assicurarsi innanzitutto che il sistema host possa accedere ai file. Ad esempio, puoi provare prima questo script sul tuo computer host per vedere. Se lo script funziona perfettamente nella macchina host ma non in QEMU, allora hai lo stesso problema.

Per risolvere questo problema, ho dovuto fare un backup del file originale in QEMU, copiarlo sul file nell'ambiente host nella jail chroot di QEMU e quindi java poteva scaricare i file normalmente in QEMU.

Una soluzione migliore sarebbe montare l' /etcambiente QEMU; tuttavia non sono sicuro se altri file saranno interessati in questo processo. Così ho deciso di usare questo brutto ma semplice rimedio.


0

Questo sembra un posto come un altro per documentare un'altra possibile ragione del famigerato messaggio di errore PKIX. Dopo aver passato troppo tempo a guardare i contenuti del keystore e del truststore e le varie configurazioni di installazione di Java mi sono reso conto che il mio problema era dovuto a ... un errore di battitura.

L'errore di battitura significava che stavo usando anche il keystore come truststore. Dato che la CA della mia azienda non è stata definita come un certificato autonomo nel keystore ma solo come parte di una catena di certificati, e non è stata definita altrove (ovvero i certificati) ho continuato a ricevere l'errore PKIX.

Dopo un rilascio fallito (questo è prod config, andava bene altrove) e due giorni di grattacapi ho finalmente visto l'errore di battitura, e ora tutto è a posto.

Spero che questo aiuti qualcuno.


-1

aggiungi questo al tuo codice:

TrustManager[] trustAllCerts = new TrustManager[]{
           new X509TrustManager() {
               @Override
               public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                   return new X509Certificate[0];
               }

               @Override
               public void checkClientTrusted(
                       java.security.cert.X509Certificate[] certs, String authType) {
               }

               @Override
               public void checkServerTrusted(
                       java.security.cert.X509Certificate[] certs, String authType) {
               }
           }
       };

       try {
           SSLContext sc = SSLContext.getInstance("SSL");
           sc.init(null, trustAllCerts, new java.security.SecureRandom());
           HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
       } catch (GeneralSecurityException e) {
       }

1
Le risposte solo al codice sono generalmente disapprovate su questo sito. Potresti modificare la tua risposta per includere alcuni commenti o una spiegazione del tuo codice? Le spiegazioni dovrebbero rispondere a domande come: cosa fa? Come lo fa? Dove va? Come risolve il problema di OP?
mypetlion il

1
aggiungi questo al tuo codice No. Non aggiungere questo al tuo codice . La creazione di un SSLContext in questo modo rimuove tutti i controlli di sicurezza che verificano l'identità del server a cui ci si sta connettendo. La risposta al problema di perdere le chiavi NON è quella di rimuovere tutti i blocchi da tutto ciò che possiedi.
Andrew Henle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.