Мне не удается отправить простой запрос GET на сторонний https-URL, который отлично работает в браузере:
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://...": Received fatal alert: handshake_failure; nested exception is javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:673)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:635)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:556)
Я пытаюсь следовать связанным ответам , но я не нашел решение.
Сертификата нет, и я использую Java 8, пробные решения как добавление -Djsse.enableSNIExtension=false -Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1
Добавлены те же заголовки, что и браузер отправляет (Accept
и User-Agent
), но не повезло
Код
UriBuilder uriBuilder = UriBuilder.fromUri(URLDecoder.decode(URL, "UTF-8"));
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "text/html,application/xhtml+xml,application/xml");
headers.add(HttpHeaders.USER_AGENT, "Mozilla...");
HttpEntity<?> entity = new HttpEntity<Object>(headers);
ResponseEntity<ResponseVO> response = restTemplate.exchange(uriBuilder.build(),
HttpMethod.GET, entity, ResponseVO.class);
- Сайт использует сервисы cloudflare
Также curl работает, помещая полный URL-адрес, из подробного вывода он использует сервер сертификат с:
SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Пробовал также с конфигурацией пропустить проверку сертификата SSL с тем же выводом:
TrustStrategy acceptTrustStrategy = (X509Certificate [] цепочка, String authType ) -> true;
SSLContext sslContext = org. apache .http.ssl.SSLContexts.custom () .loadTrustMaterial (null, acceptTrustStrategy) .build ();
Или также с NoopHostnameVerifier :
Closeabl eHttpClient httpClient = HttpClients.custom () .setSSLHostnameVerifier (новый NoopHostnameVerifier ()) .build (); HttpComponentsClientHttpRequestFactory requestFactory = новый HttpComponentsClientHttpRequestFactory (); requestFactory.setHttpClient (httpClient);
curl -v results Сертификат сервера:
* subject: CN=*.site.com,OU=Domain Control Validated
* start date: May 24 08:13:23 2019 GMT
* expire date: May 24 08:13:23 2021 GMT
* common name: *.site.com
* issuer: CN=Go Daddy Secure Certificate Authority - G2,OU=http://certs.godaddy.com/repository/,O="GoDaddy.com, Inc.",L=Scottsdale,ST=Arizona,C=US
EDIT
Я добавил сертификат в java as @ Walk предложено :
sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
Сертификат был добавлен в хранилище ключей
Я вижу сертификат, загруженный как в браузере, он работает в JMeter, но все равно не удалось с той же ошибкой при использовании restTemplate или apache HTTPClient.
Я использую Java 8 update 151.
Пробовал решение от @rmunge ответ на добавление BouncyCastleProvider, но все та же ошибка
security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider