Cliente HTTP Apache javax.net.ssl.SSLPeerUnverifiedException: ponto não autenticado

Estamos desenvolvendo um aplicativo usando tomcat e jersey.
Dentro deste webapplication precisamos nos conectar a umhttps Website com umvalidnão expiradocertificate. Se eu me conectar a este site localmente através do meu navegador Chrome, tudo funcionará bem! Infelizmente o servidor tomcat com o nosso webapp gera uma exceção. Estamos usando oApache HttpClient (4.0) para se conectar ao site https:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:371)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:126)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:572)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:645)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)

O certificado do servidor é absolutamente válido ethawte. Três ferramentas online diferentes validaram o certificado com sucesso.
Openssl também tem um problema e mostra três certificados, mas apresenta um erro simples:

Verify return code: 20 (unable to get local issuer certificate)

O problema com o openssl parece ser que ele usa o caminho errado/usr/lib/sslao invés de/etc/ssl/certs. Se eu usar o argumento CApath apontando para o caminho correto, openssl funciona bem, então isso pode ser um problema com o httpClient?

Portanto, nosso código para o cliente padrão é bem simples:

    client = new DefaultHttpClient();
    response = client.execute(url); //this throws the exception
    EntityUtils.consume(response.getEntity());

Não é uma opção permitir quaisquer certificados implementando um TrustedManager personalizado! Eu li que algumas CA's não fazem parte do JDK / JRE e por isso os certificados devem ser importados manualmente para okeystore ou usar um personalizado, mas thawte é uma CA bem conhecida e não deveria funcionar em padrão?

EDITAR

Eu configurei as propriedades javax.debug em catalina.sh para que eu tenha mais informações sobre o problema:

http-bio-8080-exec-1, handling exception: javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path validation failed: 
java.security.cert.CertPathValidatorException: basic constraints check failed: 
pathLenConstraint violated - this cert must be the last cert in the certification path

Eu apreciaria qualquer ajuda! Desde já, obrigado!

questionAnswers(2)

yourAnswerToTheQuestion