Resolvendo javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: falha na construção do caminho do PKIX Erro?


426

Edit: - Tentou formatar a pergunta e aceitar a resposta de maneira mais apresentável no meu Blog

Aqui está a questão original.

Estou recebendo este erro:

mensagem detalhada sun.security.validator.ValidatorException: falha na construção do caminho PKIX:
sun.security.provider.certpath.SunCertPathBuilderException: não foi possível encontrar o caminho de certificação válido para o destino solicitado

causa javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: falha na construção do caminho PKIX: sun.security.provider.certpath.SunCertPathBuilderException: não foi possível encontrar o caminho de certificação válido para o destino solicitado

Estou usando o Tomcat 6 como servidor da web. Eu tenho dois aplicativos da web HTTPS instalados em Tomcats diferentes em portas diferentes, mas na mesma máquina. Diga App1(port 8443)e App2(port 443). App1se conecta a App2. Quando se App1conecta App2, recebo o erro acima. Sei que este é um erro muito comum, por isso encontrei muitas soluções em diferentes fóruns e sites. Eu tenho a entrada abaixo em server.xmlambos os Tomcats:

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

Todo site diz o mesmo motivo pelo qual o certificado fornecido pelo app2 não está no repositório confiável da app1 jvm. Isso parece ser verdade também quando tentei acessar a mesma URL no navegador IE, funciona (com o aquecimento, existe um problema com o certificado de segurança deste site. Aqui digo continuar neste site). Mas quando o mesmo URL é atingido pelo cliente Java (no meu caso), recebo o erro acima. Então, para colocá-lo no armazenamento confiável, tentei estas três opções:

Opção 1

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

Opção2 Configuração abaixo na variável de ambiente

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

Opção3 Configuração abaixo na variável de ambiente

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

Mas nada funcionou .

O que finalmente funcionou foi a execução da abordagem Java sugerida em Como lidar com certificados SSL inválidos com o Apache HttpClient? por Pascal Thivent, ou seja, executando o programa InstallCert.

Mas essa abordagem é adequada para a configuração do devbox, mas não posso usá-la no ambiente de produção.

Estou perguntando por três abordagens mencionadas acima não funcionou quando eu mencionei os mesmos valores em server.xmlde app2valores de servidores e mesmo no truststore por definição

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

no app1programa.

Para mais informações, é assim que estou fazendo a conexão:

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

possível duplicata de HttpClient e SSL
Marquis of Lorne

Por incrível que pareça, recebi esse erro ao me comunicar entre servidores em cluster que não apresentavam problemas de SSL individualmente. Depois de definir corretamente domainnamemeus servidores RHEL, o problema desapareceu. Espero que ajude alguém.
DavidG

Outra coisa a verificar é que você possui a versão mais recente do Java - eu estava recebendo um erro semelhante por causa disso.
Redzarf

stackoverflow.com/questions/2893819/… - também relevante e uma resposta fantástica.
Siddhartha

Respostas:


406

Você precisa adicionar o certificado para App2 ao arquivo de armazenamento confiável da JVM usada localizada em %JAVA_HOME%\lib\security\cacerts.

Primeiro, você pode verificar se o seu certificado já está no armazenamento confiável executando o seguinte comando: keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"(você não precisa fornecer uma senha)

Se o seu certificado estiver ausente, você pode obtê-lo baixando-o com o navegador e adicioná-lo ao armazenamento confiável com o seguinte comando:

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

Após a importação, você pode executar o primeiro comando novamente para verificar se o seu certificado foi adicionado.

Informações da Sun / Oracle podem ser encontradas aqui .


6
Você terá que usar o caminho completo, por exemplo, c: \ java \ jdk \ lib \ security \ cacerts
SimonSez

48
Como o SimonSez disse, você não precisa de uma senha, mas se quiser, a senha padrão é "changeit".
Felix

16
Além disso, no Windows, você precisa executar o terminal como administrador, caso contrário, receberá o erro keytool error: java.io.FileNotFoundException ... (Access is denied)ao tentar importar seu certificado.
Felix

2
Ah @SimonSez você é meu deus. Mas, para adicionar a isso, é preciso especificar o local e a senha do armazenamento confiável, conforme mencionado pelo @M Sach, para que ele funcione.
BudsNanKis

2
Continuou com problemas com o Java 1.8. Necessário adicionar cert como descrito e usar Java <1.8 #
Tom Howard

180

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: falha na construção do caminho PKIX: sun.security.provider.certpath.SunCertPathBuilderException: não foi possível encontrar o caminho de certificação válido para o destino solicitado

• Quando recebi o erro, tentei pesquisar no Google o significado da expressão e descobri que esse problema ocorre quando um servidor altera o certificado SSL HTTPS e nossa versão mais antiga do java não reconhece a autoridade de certificação raiz (CA) .

• Se você pode acessar a URL HTTPS no seu navegador, é possível atualizar o Java para reconhecer a CA raiz.

• No seu navegador, acesse a URL HTTPS que Java não pôde acessar. Clique na cadeia de certificados HTTPS (existe um ícone de cadeado no Internet Explorer), clique no cadeado para visualizar o certificado.

• Vá para "Detalhes" do certificado e "Copiar para arquivo". Copie-o no formato Base64 (.cer) . Ele será salvo na sua área de trabalho.

• Instale o certificado ignorando todos os alertas.

• Foi assim que reuni as informações do certificado da URL que estava tentando acessar.

Agora eu tive que fazer minha versão java para conhecer o certificado, para que ele não se recuse a reconhecer a URL. A esse respeito, devo mencionar que pesquisei que as informações do certificado raiz permanecem por padrão no local \ jre \ lib \ security do JDK e a senha padrão para acessar é: changeit.

Para visualizar as informações de cacerts, a seguir estão os procedimentos a seguir:

• Clique no botão Iniciar -> Executar

• Digite cmd. O prompt de comando é aberto (pode ser necessário abri-lo como administrador).

• Vá para o seu Java/jreX/bindiretório

• Digite o seguinte

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

Ele fornece a lista dos certificados atuais contidos no keystore. Parece algo como isto:

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

Digite a senha do keystore: changeit

Tipo de armazenamento de chaves: jks

Fornecedor de keystore: SUN

Seu keystore contém 44 entradas

verisignclass3g2ca, 26 de março de 2004, trustCertEntry,

Impressão digital do certificado (MD5): A2: 33: 9B: 4C: 74: 78: 73: D4: 6C: E7: C1: F3: 8D: CB: 5C: E9

entrustclientca, 9 de janeiro de 2003, trustCertEntry,

Impressão digital do certificado (MD5): 0C: 41: 2F: 13: 5B: A0: 54: F5: 96: 66: 2D: 7E: CD: 0E: 03: F4

thawtepersonalbasicca, 13 de fevereiro de 1999, trustCertEntry,

Impressão digital do certificado (MD5): E6: 0B: D2: C9: CA: 2D: 88: DB: 1A: 71: 0E: 4B: 78: EB: 02: 41

addtrustclass1ca, 1 de maio de 2006, trustCertEntry,

Impressão digital do certificado (MD5): 1E: 42: 95: 02: 33: 92: 6B: B9: 5F: C0: 7F: DA: D6: B2: 4B: FC

verisignclass2g3ca, 26 de março de 2004, trustCertEntry,

Impressão digital do certificado (MD5): F8: BE: C4: 63: 22: C9: A8: 46: 74: 8B: B8: 1D: 1E: 1E: 4A: 2B: F6

• Agora eu tinha que incluir o certificado instalado anteriormente nos cacerts.

• Para isso, é o seguinte o procedimento:

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

Se você estiver usando o Java 7:

keytool –importcert –trustcacerts –alias ALIASNAME - arquivo PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE - keystore PATH_TO_CACERTS_FILE - storepass changeit

• Ele adicionará as informações do certificado ao arquivo cacert.

É a solução que encontrei para a exceção mencionada acima !!


5
O que você faz quando o certificado expira? Repita tudo (anualmente)?
ggkmath

7
Existe alguma maneira de fazer isso programaticamente?
precisa saber é o seguinte

1
Para as pessoas que lidam com o erro PKIX, "o Path não está associado a nenhuma das âncoras de confiança", infelizmente esta solução não resolveu esse problema para mim.
IcedDante

3
Uma pergunta - o aliasName é o endereço da web para o qual estamos importando o certificado? Por exemplo, se URL for domain.site.com/pages/service.asmx, também deve ser domain.site.com ou URL completo (domain.site.com/pages/service.asmx) ou também deve ser prefixado com http : // ou é apenas um nome arbitrário?
Nanosoft 18/12/2014

1
caminho: \ lib \ security> keytool -import -noprompt -trustcacerts -alias webCert -arquivo webCertResource.cer -keystore c: / Usuários / Jackie / Desktop -storepass changeit Recebo "o sistema não consegue encontrar o arquivo especificado"
Jesse

46

Como trabalhar no Tomcat 7

Eu queria oferecer suporte a um certificado autoassinado em um aplicativo Tomcat, mas o seguinte trecho não funcionou

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

Foi isso que resolveu meu problema:

1) Baixe o .crtarquivo

echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
  • substitua <your domain>pelo seu domínio (por exemplo jossef.com)

2) Aplique o .crtarquivo no cacertsarmazenamento de certificados do Java

keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
  • substitua <your domain>pelo seu domínio (por exemplo jossef.com)
  • substitua <JAVA HOME>pelo seu diretório home java

3) hackear

Embora tenha instalado meu certificado nos Javaarmazenamentos de certificados padrão do Tomcat , o Tomcat ignora isso (parece que não está configurado para usar os armazenamentos de certificados padrão do Java).

Para hackear isso, adicione o seguinte em algum lugar no seu código:

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

// ...

4
O passo 2 fez o truque para mim usando o SpringBoot e o Tomcat 7. Obrigado.
Tim Perry

Eu tenho que usar keytool do Java que é usado por tomcat porque em um servidor que pode ter muitos java?
vikifor

@vikifor yes. Você também pode executá-lo para todos os diretórios Java instalado em seu sistema
Jossef Harush

1
Isso funcionou! muito obrigado @JossefHarush por uma resposta tão útil!
Tom Taylor

1
meu problema foi resolvido depois de adicionar o segmento de código de @Jossef Harush ao meu código.
Chamod Pathirana 4/03

10

No meu caso, o problema era que o servidor da web estava enviando apenas o certificado e a CA intermediária, não a CA raiz. A adição desta opção da JVM resolveu o problema:-Dcom.sun.security.enableAIAcaIssuers=true

O suporte para o método de acesso de solicitadores da extensão Acesso à informação da autoridade está disponível. Ele está desativado por padrão para compatibilidade e pode ser ativado configurando a propriedade do sistema com.sun.security.enableAIAcaIssuerspara o valor true.

Se definida como true, a implementação do CertPathBuilder da Sun no PKIX usa as informações na extensão AIA de um certificado (além das CertStores especificadas) para encontrar o certificado de CA de emissão, desde que seja um URI do tipo ldap, http ou ftp.

Fonte


Isso realmente resolveu meu problema, obrigado!
Luís Silva

6

Outro motivo pode ser uma versão desatualizada do JDK. Eu estava usando o jdk versão 1.8.0_60, basta atualizar a última versão para resolver o problema de certificado.


2
Eu também tive o mesmo problema. Chamar uma API com um certificado Lets Encrypt pode não funcionar com versões mais antigas do Java, porque não é reconhecido pelas autoridades de certificação raiz confiáveis. A atualização do Java resolverá esse problema.
hertg

5

Meu arquivo de cacerts estava totalmente vazio. Resolvi isso copiando o arquivo cacerts da minha máquina Windows (que usa o Oracle Java 7) e scp'd na minha caixa Linux (OpenJDK).

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

e depois na máquina linux

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

Até agora, funcionou muito bem.


1
Isso funciona maravilhosamente se o problema é que você está usando uma versão mais antiga do java que não possui os certificados mais recentes.
Atripathi

@atripathi, que tal um Mac?
iOSAndroidWindowsMobileAppsDev

Havia algo seriamente errado com a instalação do Java se o arquivo cacerts estivesse vazio. Você deveria ter reinstalado tudo.
Marquês de Lorne

Talvez, mas essa solução funcionou e nada ficou errado depois.
Ryan Shillington

5

Para mim, esse erro apareceu também ao tentar conectar-se a um processo atrás de um proxy reverso NGINX que estava manipulando o SSL.

Acabou que o problema era um certificado sem toda a cadeia de certificados concatenada. Quando adicionei certificados intermediários, o problema foi resolvido.

Espero que isto ajude.


isso é o que estou tendo. você pode explicar como adicionou os certificados intermediários e onde. estou usando o proxy reverso httpd e não o NGINX.
Asaf Magen

Isso me ajudou no meu caso becasue im usando httpd: access.redhat.com/solutions/43575
Asaf Magen

Com o nginx, ele usa apenas arquivos .key e .pem para a configuração SSL. Primeiro você converte .crt em .pem (simplesmente: cp yourfile.crt yourfile.pem) e depois na cadeia de certificação SSL: você anexa o arquivo .cer ao último de .pem (cat yourfile.cer >> yourfile.pem)
Thế Anh Nguyễn

5

Usando o Tomcat 7 no Linux, isso fez o truque.

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

No Linux, $JAVA_HOMEnem sempre é configurado, mas geralmente /etc/alternatives/jreaponta para$JAVA_HOME/jre


5

O código abaixo funciona para mim:

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
Este código é totalmente inseguro e não deve ser usado.
Marquês de Lorne

@ user207421 Por que é inseguro? O que está acontecendo no código brevemente.
Govinda Sakhare 26/07/19

Isso está ignorando todas as validações de certificado, basicamente está permitindo que qualquer certificado seja aceito. A maneira como o certificado funciona é que há um certificado raiz (literalmente) fisicamente protegido, em várias autoridades de certificação. Este certificado é então usado para emitir outros certificados secundários, que podem ser validados desde a autoridade de certificação raiz. Isso está ignorando todas as verificações anteriores, o que significa que eu posso enviar qualquer certificado SSL (mesmo que gerado automaticamente) e seu aplicativo o aceitará como seguro, mesmo que minha identidade como URL não seja verificada.
Scott Taylor

4

Eu estava usando jdk1.8.0_171 quando enfrentei o mesmo problema. Tentei as 2 principais soluções aqui (adicionando um certificado usando o keytool e outra solução que possui um hack), mas elas não funcionaram para mim.

Atualizei meu JDK para 1.8.0_181e funcionou como um encanto.


2

Eu escrevi um pequeno script estúpido do cmd (linha de comando) do win32 (WinXP 32bit testet), que procura todas as versões java nos arquivos de programas e adiciona um certificado a elas. A senha precisa ser o "changeit" padrão ou altere você mesmo no 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

Para o MacOS X abaixo, é o comando exato que funcionou para mim, onde eu tive que tentar com duplo hífen na opção 'importcert', que funcionou:

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

Para mim, não funcionou a solução reconhecida desta postagem: https://stackoverflow.com/a/9619478/4507034 .

Em vez disso, consegui resolver o problema importando a certificação para as certificações confiáveis ​​da minha máquina.

Passos:

  1. Vá para o URL (por exemplo https://localhost:8443/yourpath) onde a certificação não está funcionando.
  2. Exporte a certificação conforme descrito na publicação mencionada.
  3. Na sua máquina Windows, abra: Manage computer certificates
  4. Vá para Trusted Root Certification Authorities->Certificates
  5. Importe aqui seu your_certification_name.cerarquivo.

1

Para o Tomcat em execução no servidor Ubuntu, para descobrir qual Java está sendo usado, use o comando "ps -ef | grep tomcat":

Amostra:

/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

Em seguida, podemos acessar: cd /usr/local/java/jdk1.7.0_15/jre/lib/security

O arquivo cacerts padrão está localizado aqui. Insira o certificado não confiável nele.


1

por segurança, não devemos usar certificados autoassinados em nossa implementação. No entanto, quando se trata de desenvolvimento, geralmente precisamos usar ambientes de teste com certificados autoassinados. Tentei corrigir esse problema programaticamente no meu código e falhei. No entanto, a adição do certificado à jre trust-store corrigiu meu problema. Encontre os passos abaixo,

  1. Faça o download do certificado do site,

  2. Copie o certificado (ex: cert_file.cer) no diretório $ JAVA_HOME \ Jre \ Lib \ Security

  3. Abra o CMD no Administrator e altere o diretório para $ JAVA_HOME \ Jre \ Lib \ Security

  4. Importe o certificado para um armazenamento confiável usando o comando abaixo,

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

Se você encontrou um erro dizendo que o keytool não é reconhecível, consulte isso.

Digite sim como abaixo

Confie neste certificado: [Sim]

  1. Agora tente executar seu código ou acessar a URL programaticamente usando java.

Atualizar

Se o servidor de aplicativos for o jboss, tente adicionar a propriedade do sistema abaixo

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

Espero que isto ajude!


1

SOLUÇÃO IMPLANTÁVEL (Alpine Linux)

Para poder corrigir esse problema em nossos ambientes de aplicativos, preparamos os comandos do terminal Linux da seguinte maneira:

cd ~

Gerará arquivo cert no diretório inicial.

apk add openssl

Este comando instala o openssl no Linux alpino. Você pode encontrar comandos adequados para outras distribuições Linux.

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

Gerou o arquivo cert necessário.

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

Aplicou o arquivo gerado ao JRE com o programa 'keytool'.

Nota: Substitua seu DNS por<host-dns-ssl-belongs>

Nota2: Observe com cuidado que -nopromptnão solicitará a mensagem de verificação (sim / não) e o -storepass changeitparâmetro desativará o prompt de senha e fornecerá a senha necessária (o padrão é 'changeit'). Essas duas propriedades permitem usar esses scripts nos ambientes de aplicativos, como a construção de uma imagem do Docker.

Nota3 Se você estiver implantando seu aplicativo via Docker, poderá gerar o arquivo secreto uma vez e colocá-lo nos arquivos de projeto do aplicativo. Você não precisará gerá-lo repetidamente.


0

Eu tenho esse problema tambem.

Tentei quase tudo adicionando o certificado SSL ao .keystore, mas ele não estava funcionando com o Java1_6_x. Para mim, ajudou se começarmos a usar a versão mais recente do Java, Java1_8_x como JVM.


1
O mesmo para mim. Uma atualização do Java 1.8.0_91 para 1.8.0_121 resolveu o problema. Eu recebi a exceção usando o Apache HTTPClient.
Devabc

Eu ainda tenho esse problema usando a autenticação OAuth2
Sofiane

0

Eu estava tendo esse problema com o Android Studio quando estava atrás de um proxy. Eu estava usando o Crashlytics que tenta carregar o arquivo de mapeamento durante uma compilação.

Adicionei o certificado de proxy ausente ao armazenamento confiável localizado em /Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts

com o seguinte comando: keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]

por exemplo, com a senha padrão do armazenamento confiável keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt


0

Apenas um pequeno truque. Atualize a URL no arquivo "hudson.model.UpdateCenter.xml" de https para 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

Quero entrar em cena, já que tenho um ambiente QEMU em que tenho que baixar arquivos em java. Acontece que /etc/ssl/certs/java/cacertsno QEMU há um problema porque não corresponde ao /etc/ssl/certs/java/cacertsambiente do host. O ambiente host está atrás de um proxy da empresa, portanto, o java cacerts é uma versão customizada.

Se você estiver usando um ambiente QEMU, verifique se o sistema host pode acessar os arquivos primeiro. Por exemplo, você pode tentar esse script na máquina host primeiro para ver. Se o script funcionar bem na máquina host, mas não no QEMU, você está tendo o mesmo problema que eu.

Para resolver esse problema, tive que fazer um backup do arquivo original no QEMU, copiar sobre o arquivo no ambiente host para a prisão chroot do QEMU e, em seguida, o java poderia baixar arquivos normalmente no QEMU.

Uma solução melhor seria montar o /etcambiente QEMU; no entanto, não tenho certeza se outros arquivos serão impactados nesse processo. Então decidi usar essa solução feia, mas fácil.


0

Parece um local tão bom quanto qualquer outro para documentar outro possível motivo para a infame mensagem de erro do PKIX. Depois de passar muito tempo olhando o conteúdo do keystore e do armazenamento confiável e várias configurações de instalação do java, percebi que meu problema era baixo ... um erro de digitação.

O erro de digitação significava que eu também estava usando o keystore como o armazenamento confiável. Como minha CA raiz da empresa não foi definida como um certificado independente no keystore, mas apenas como parte de uma cadeia de certificados, e não foi definida em nenhum outro lugar (por exemplo, cacerts), eu continuava recebendo o erro PKIX.

Depois de um lançamento com falha (esta é uma configuração de prod, estava tudo bem em outro lugar) e dois dias de coçar a cabeça, finalmente vi o erro de digitação, e agora tudo está bem.

Espero que isso ajude alguém.


-1

adicione isso ao seu código:

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
As respostas somente de código geralmente são desaprovadas neste site. Você poderia editar sua resposta para incluir alguns comentários ou explicações sobre seu código? As explicações devem responder a perguntas como: O que faz? Como isso acontece? Onde isso vai? Como ele resolve o problema do OP?
mypetlion

1
adicione isso ao seu código Não . Não adicione isso ao seu código . Criar um SSLContext dessa maneira remove todas as verificações de segurança que verificam a identidade do servidor ao qual você está se conectando. A resposta para o problema de perder suas chaves NÃO é remover todos os bloqueios de tudo o que você possui.
Andrew Henle
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.