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 solicitadocausa 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)
. App1
se conecta a App2
. Quando se App1
conecta 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.xml
ambos 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.xml
de app2
valores 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 app1
programa.
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());
domainname
meus servidores RHEL, o problema desapareceu. Espero que ajude alguém.Respostas:
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 .
fonte
keytool error: java.io.FileNotFoundException ... (Access is denied)
ao tentar importar seu certificado.• 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/bin
diretório• Digite o seguinte
Ele fornece a lista dos certificados atuais contidos no keystore. Parece algo como isto:
• Agora eu tinha que incluir o certificado instalado anteriormente nos cacerts.
• Para isso, é o seguinte o procedimento:
Se você estiver usando o Java 7:
• Ele adicionará as informações do certificado ao arquivo cacert.
É a solução que encontrei para a exceção mencionada acima !!
fonte
Como trabalhar no Tomcat 7
Eu queria oferecer suporte a um certificado autoassinado em um aplicativo Tomcat, mas o seguinte trecho não funcionou
Foi isso que resolveu meu problema:
1) Baixe o
.crt
arquivo<your domain>
pelo seu domínio (por exemplojossef.com
)2) Aplique o
.crt
arquivo nocacerts
armazenamento de certificados do Java<your domain>
pelo seu domínio (por exemplojossef.com
)<JAVA HOME>
pelo seu diretório home java3) hackear
Embora tenha instalado meu certificado nos
Java
armazenamentos 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:
fonte
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
Fonte
fonte
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.
fonte
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).
e depois na máquina linux
Até agora, funcionou muito bem.
fonte
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.
fonte
Usando o Tomcat 7 no Linux, isso fez o truque.
No Linux,
$JAVA_HOME
nem sempre é configurado, mas geralmente/etc/alternatives/jre
aponta para$JAVA_HOME/jre
fonte
O código abaixo funciona para mim:
fonte
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_181
e funcionou como um encanto.fonte
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 :-)
fonte
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:
fonte
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:
https://localhost:8443/yourpath
) onde a certificação não está funcionando.Manage computer certificates
Trusted Root Certification Authorities
->Certificates
your_certification_name.cer
arquivo.fonte
Para o Tomcat em execução no servidor Ubuntu, para descobrir qual Java está sendo usado, use o comando "ps -ef | grep tomcat":
Amostra:
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.
fonte
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,
Faça o download do certificado do site,
Copie o certificado (ex: cert_file.cer) no diretório $ JAVA_HOME \ Jre \ Lib \ Security
Abra o CMD no Administrator e altere o diretório para $ JAVA_HOME \ Jre \ Lib \ Security
Importe o certificado para um armazenamento confiável usando o comando abaixo,
Se você encontrou um erro dizendo que o keytool não é reconhecível, consulte isso.
Digite sim como abaixo
Atualizar
Se o servidor de aplicativos for o jboss, tente adicionar a propriedade do sistema abaixo
Espero que isto ajude!
fonte
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:
Gerará arquivo cert no diretório inicial.
Este comando instala o openssl no Linux alpino. Você pode encontrar comandos adequados para outras distribuições Linux.
Gerou o arquivo cert necessário.
Aplicou o arquivo gerado ao JRE com o programa 'keytool'.
Nota: Substitua seu DNS por
<host-dns-ssl-belongs>
Nota2: Observe com cuidado que
-noprompt
não solicitará a mensagem de verificação (sim / não) e o-storepass changeit
parâ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.
fonte
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.
fonte
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
fonte
Apenas um pequeno truque. Atualize a URL no arquivo "hudson.model.UpdateCenter.xml" de https para http
fonte
Quero entrar em cena, já que tenho um ambiente QEMU em que tenho que baixar arquivos em java. Acontece que
/etc/ssl/certs/java/cacerts
no QEMU há um problema porque não corresponde ao/etc/ssl/certs/java/cacerts
ambiente 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
/etc
ambiente 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.fonte
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.
fonte
adicione isso ao seu código:
fonte