Java.security.cert.CertificateException: Untrusted Server Certificate Chain

5 respostas
A

Boa tarde,

Estou tentado Abrir um site seguro via Java mas tenho duas situações em dois ambientes.

Tenho um ambiente (Desenvolvimento) rodando com JRE1.5 (Já rodei nas Builds 05,07,09,11) tentando acessar um site seguro (HTTPS)
Não informei chave, nem certificado, nem nada. apenas especifiquei a URL, passei os parâmetros através do PostMethod do HTTPClient e perfeito!
Obtive resultado 100% OK.

Meu segundo ambiente é meu servidor, que está rodando JDK1.5_05 (já tentei no JRE1.5_07) rodando o mesmo programa.
Mas… (odeio essa parte do mas…)
ele me retornou este erro:

[09/Fev/2007 14:41:07:406] [#CUSTOMReceiverDicicoToBasf#]  Exception: java.security.cert.CertificateException: Untrusted Server Certificate Chain
[12/Fev/2007 14:53:56:250] StackTrace: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Untrusted Server Certificate Chain
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source)
	at org.apache.commons.httpclient.HttpConnection$WrappedOutputStream.write(HttpConnection.java:1368)
	at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
	at java.io.BufferedOutputStream.flush(Unknown Source)
	at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:799)
	at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2277)
	at org.apache.commons.httpclient.HttpMethodBase.processRequest(HttpMethodBase.java:2657)
	at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1093)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:675)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:529)
	at pacote.EDIReceiver.receiveMessages(EDIReceiver.java:70)
	at pacote.CUSTOMReceiver.receiveMessages(CUSTOMReceiver.java:57)
	at pacote.ReceiverCommand.execute(ReceiverCommand.java:62)
	at pacote.ReceiverFlow.receiveMessage(ReceiverFlow.java:248)
	at pacote.ReceiverFlow.run(ReceiverFlow.java:97)
Caused by: java.security.cert.CertificateException: Untrusted Server Certificate Chain
	at com.sun.net.ssl.X509TrustManagerJavaxWrapper.checkServerTrusted(Unknown Source)
	at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
	... 22 more

O meu programa na linha 70 (onde ele acusa o erro tem o seguinte fonte) é onde ele faz o “executeMethod” do HTTPClient.

Alguém tem alguma idéia?

Ats,
Endrigo Antonini

5 Respostas

O

Você está acessando o mesmo servidor de HTTPS nos dois casos? Se sim, o certificado do servidor é “autentico” (assinado por uma CA) ou é “auto-assinado”?
Não tenho certeza, mas parece que a JDK não está conseguindo verificar se o certificado do servidor é autentico. Isto pode acontecer se o certificado for auto-assinado ou foi assinado por uma CA que não tem no arquivo de certificados root da JDK ($JAVA_HOME/jre/lib/security/cacerts). Por exemplo, certificados emitidos pela Serasa não possuem certificado root no cacerts (certificado root do ICP-Brasil).

A

Oyama,
valeu pela resposta…
Sim… os dois ambientes estão acessando o mesmo servidor.
A URL é da LocaWeb…

Emitido por: Comodo Class 3 Security Services CA
Emitido para: *.locaweb.com.br
Validade: 26/04/2005 à 14/07/2008

Vou dar uma olhada se existe diferença no arquivo cacerts dos meus dois ambientes.

Ats,
Endrigo Antonini

A

Bom dia,

Acabei de conferir o arquivo cacerts que está em meu servidor e em meu diretório local.

Ambos possuem o mesmo tamanho (segundo as propriedades do arquivo: Tamanho em Disco: 32.768 bytes).

O que pode ser?

Ats,
Endrigo Antonini

O

antonini:
Bom dia,

Acabei de conferir o arquivo cacerts que está em meu servidor e em meu diretório local.

Ambos possuem o mesmo tamanho (segundo as propriedades do arquivo: Tamanho em Disco: 32.768 bytes).

O que pode ser?

Listei os cacerts das JRE1.5.0_04, JRE1.5.0_06, JRE1.5.0_08 e JRE1.5.0_11 e só achei o certificado root da comodo nas JRE1.5.0_08 e JRE1.5.0_11. Ou seja, acho que este certificado root só foi incluido nas JRE1.5.0_08 para cima.

Acredito que seja este o problema. Tente listar o cacerts para verificar se encontra o certificado root da comodo.

A

Consegui,

era problema de “ambiente”…
baixei a licença ilimitada da SUN e coloquei o diretorio ext do jdk no ext do Java (java.ext.dirs).

Agora está funcionando.

Valeu pela ajuda!!

Ats,
Endrigo Antonini

Criado 12 de fevereiro de 2007
Ultima resposta 1 de mar. de 2007
Respostas 5
Participantes 2