Как получить веб-ресурс HTTPS с помощью HttpClient 4.5.2 и JDK 1.8, когда сервер использует расширение указания имени сеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как получить веб-ресурс HTTPS с помощью HttpClient 4.5.2 и JDK 1.8, когда сервер использует расширение указания имени се

Сообщение Anonymous »

Я не могу получить ресурсы с сайтов SNI с помощью HttpClient. URL-адреса, которые я пытаюсь получить: https://dabar.srce.hr/, https://www.lutrija.hr/cms/splash.

Я получаю эта ошибка:
javax.net.ssl.SSLHandshakeException: получено фатальное предупреждение: Handshake_failure

Насколько я понимаю из документации, из коробки оно должно работать так ( и это работает для сайтов, не использующих https):

Код: Выделить всё

url = "https://dabar.srce.hr/";
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
// trust all certificates
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return true;
}
}).build();
SSLConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslSF).build();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(httpGet);
System.out.println(response.getStatusLine().toString());
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity));
Я пытался явно включить SNIExtension:

Код: Выделить всё

System.setProperty("jsse.enableSNIExtension", "true");
Я попробовал переопределить SSLConnectionSocketFactory:

Код: Выделить всё

SSLConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE) {
String targetHost = "";
@Override
public Socket createLayeredSocket(Socket socket, String target, int port, HttpContext context)
throws IOException {
this.targetHost = target;
return super.createLayeredSocket(socket, target, port, context);
}
@Override
protected void prepareSocket(SSLSocket socket) throws IOException {
try {
PropertyUtils.setProperty(socket, "host", this.targetHost);
} catch (Exception ex) {
}
super.prepareSocket(socket);
}
@Override
public Socket connectSocket(int connectTimeout, Socket socket, HttpHost host, InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpContext context)
throws IOException {
if (socket instanceof SSLSocket) {
try {
PropertyUtils.setProperty(socket, "host", host.getHostName());
} catch (NoSuchMethodException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
}
return super.connectSocket(connectTimeout, socket, host, remoteAddress,
localAddress, context);
}
};
Чего мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/388 ... erver-uses
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»