Документация Oracle, похоже, указывает, что Java 8 отправляет SNI автоматически и по умолчанию. Wireshark указывает на обратное. Я системный администратор PowerShell, а не разработчик Java, поэтому почти наверняка что-то упускаю из виду.
При использовании с надлежащим хранилищем ключей доверия следующий код возвращает статус 200 со всех веб-сайтов SSL, которым не требуется SNI. Он также хорошо работает при подключении к веб-сайту SSL по умолчанию на сервере Apache с несколькими хостами. Однако при запросе на подключение к сайту, отличному от используемого по умолчанию, происходит сбой из-за того, что имя сертификата не соответствует имени сайта, поскольку он подключается к сайту по умолчанию.
import java.util.*;
import java.net.*;
import javax.net.ssl.*;
import java.io.*;
public class testJavaHttpConn {
public static void main(String[] args) throws Exception {
String strUrl = args[0];
System.out.println("Trying to connect to " + strUrl);
try {
URL url = new URL(strUrl);
HttpsURLConnection urlConn = (HttpsURLConnection) url.openConnection();
System.out.println("Connecting");
urlConn.connect();
System.out.println("Done");
System.out.println("Response " + urlConn.getResponseCode());
} catch (IOException e) {
System.err.println("Error creating HTTP connection");
e.printStackTrace();
throw e;
}
}
}
Я не установил System.setProperty("jsse.enableSNIExtension", "false"); и когда я устанавливаю -Djavax.net.debug=ssl, он ясно показывает, что расширение имени сервера не установлено.
Я знаю, что могу реализовать SSLSocket и установить SSLParameter serverName, если я хочу погрузиться на следующий более глубокий уровень абстракции, но я бы хотел этого избежать.
Редактировать: код работает так, как написано выше для Flo в комментариях. У меня не получается с 1.8.0_72 в Linux 2.6.18-194.11.3.el5 и с 1.8.0_51 в Windows 7. Установка Windows является ванильной, а установка Linux обновила значение urandom до securerandom.source=file: /dev/./urandom. Я не уверен, как я могу определить, что в моих установках отличается от установок Фло.