Интересно, как настроить проверку сертификата SSL для драйвера Apache HIVE JDB C в Java. Это включает в себя включение использования самозаверяющих сертификатов, а также игнорирование других ошибок проверки.
Этот код выдает ошибку:
// using library hive-jdbc-3.1.2-standalone.jar
Class.forName("org.apache.hive.jdbc.HiveDriver");
Connection con = DriverManager.getConnection("jdbc:hive2://somethingsomethinghere.azurehdinsight.net:443/default;transportMode=http;ssl=true;httpPath=/hive2", "user@somedomain.com", "ultra-secure password");
Если код будет работать, соединение с HIVE будет установлен, и con
будет установлен соответственно. Вместо этого я получаю эту ошибку:
java.sql.SQLException: Could not open client transport with JDBC Uri: jdbc:hive2://somethingsomethinghere.azurehdinsight.net:443/default;transportMode=http;ssl=true;httpPath=/hive2: Could not establish connection to jdbc:hive2://somethingsomethinghere.azurehdinsight.net:443/default;transportMode=http;ssl=true;httpPath=/hive2;sasl.qop=auth: javax.net.ssl.SSLPeerUnverifiedException: Host name '123.123.123.123' does not match the certificate subject provided by the peer (CN=*.azurehdinsight.net)
at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:256)
at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:107)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at MyFancyButNotWorkingClass.main(MyFancyButNotWorkingClass.java:102)
Совершенно очевидно, что добавление сертификата в хранилище ключей не помогает, как кажется, для неправильного сервера. Однако я (напрасно) надеялся, что доверенный сертификат будет принят, даже если он будет использоваться другим сервером (что явно нарушит концепцию сертификатов SSL-сервера для аутентификации).
Некоторые сертификаты можно сделать заслуживающими доверия добавление их в локальное хранилище ключей, например, образец сертификата https://self-signed.badssl.com. Вот как он добавляется в хранилище ключей:
%JAVA_HOME%\bin\keytool.exe" -import -file <CERTIFICATE-FILE-NAME> -alias <SOME-NAME> -keystore my-sample-store
Общий подход к настройке процесса проверки SSL описан в Apache Компоненты HTTP - Управление соединениями - SSL . С этой документацией (и некоторыми исследованиями на этом и других форумах) я получил следующий код:
SSLContext sslContext = SSLContext.getDefault();
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("http", PlainConnectionSocketFactory.getSocketFactory()).register("https", sslSocketFactory).build();
Поскольку это не имело никакого эффекта, я изучил реализацию HiveConnection. java и обнаружил, что SSLConnectionSocketFactory
инициализируется с использованием ненастраиваемого DefaultHostnameVerifier
.
Я что-то здесь упускаю? Есть ли способ установить стандартные настройки HTTP Client Factory для JVM, которые затем будет использовать реализация HIVE?