Recientemente, mientras trabajaba con HttpClient para acceder al servicio de terceros (servicio CURL) en la aplicación Java, me encontré con un problema como:
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake ....
Tengo este problema en JDK 7. Con algunas investigaciones sobre este problema, encontré 2 sugerencias, es decir
Entonces, estoy tratando de entender cómo se lleva a cabo SSL Handshaking en Java 8 en comparación con Java 7 o inferior. Y puedo solucionar este problema en JDK7
Fragmento de código
public String getProduct(final String accessToken) throws IOException, ParseException { log.info("accessToken: " + accessToken); final String stringUrl = "https://api.molt.in/v1/products"; HttpClient httpClient = HttpClientBuilder.create().build(); HttpGet getRequest = new HttpGet(stringUrl); getRequest.setHeader("Authorization", "Bearer " + accessToken); HttpContext httpContext = new BasicHttpContext(); HttpResponse response = httpClient.execute(getRequest, httpContext); log.info("Response Code : " + response.getStatusLine().getStatusCode()); BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer result = new StringBuffer(); String line = ""; while ((line = rd.readLine()) != null) { result.append(line); } log.info("result: " + result); rd.close(); return result.toString(); }
~ Saludos,
Chandán
El servidor cierra el protocolo de enlace porque el cliente usa un protocolo no compatible. Consulte esta pregunta , donde se sugiere iniciar Java 7 con:
-Dhttps.protocols=TLSv1.1,TLSv1.2
Obtendría un error de su cliente (javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failure) si el certificado del servidor no fuera de confianza, y funciona de esta manera: el cliente Java verifica el certificado del servidor para asegurarse de que la máquina con la que está hablando es realmente quien dice ser, en su ejemplo "api.molt.in". El cheque funciona así:
La lista de partes de confianza puede actualizarse en cada versión menor de Java. Por ejemplo, Java 8 solo confía en los certificados generados con Let's encrypt desde la actualización 101 .