Persegui esse problema em um provedor de certificados que não faz parte dos hosts confiáveis da JVM padrão a partir de JDK 8u74
. O provedor é www.identrust.com , mas esse não era o domínio ao qual eu estava tentando me conectar. Esse domínio recebeu seu certificado desse provedor. Consulte A raiz cruzada cobrirá a confiança na lista padrão no JDK / JRE? - leia algumas entradas. Consulte também Quais navegadores e sistemas operacionais suportam Let's Encrypt .
Portanto, para me conectar ao domínio em que me interessava, que tinha um certificado emitido identrust.com
, executei as etapas a seguir. Basicamente, eu tive que obter o identrust.com (DST Root CA X3
certificado ) para ser confiável pela JVM. Consegui fazer isso usando o Apache HttpComponents 4.5 da seguinte forma:
1: Obtenha o certificado da indettrust em Instruções para download da cadeia de certificados . Clique no link DST Root CA X3 .
2: Salve a seqüência de caracteres em um arquivo chamado "DST Root CA X3.pem". Certifique-se de adicionar as linhas "----- COMEÇAR CERTIFICADO -----" e "----- TERMINAR CERTIFICADO -----" no arquivo no início e no final.
3: Crie um arquivo java keystore, cacerts.jks com o seguinte comando:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: Copie o keystore cacerts.jks resultante no diretório de recursos do seu aplicativo java / (maven).
5: Use o código a seguir para carregar esse arquivo e anexá-lo ao Apache 4.5 HttpClient. Isso resolverá o problema para todos os domínios que possuem certificados emitidos a partir do indetrust.com
util oracle, incluindo o certificado no keystore padrão do JRE.
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File(CalRestClient.class.getResource("/cacerts.jks").getFile()), "yourpasword".toCharArray(),
new TrustSelfSignedStrategy())
.build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
Quando o projeto é desenvolvido, o cacerts.jks será copiado no caminho de classe e carregado a partir daí. Neste momento, não testei em outros sites SSL, mas se o código acima "encadear" neste certificado, eles também funcionarão, mas, novamente, não sei.
Referência: contexto SSL personalizado e Como aceito um certificado autoassinado com um Java HttpsURLConnection?