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.