Apache HIVE JDB C: Как настроить проверку сертификата SSL? - PullRequest
0 голосов
/ 07 апреля 2020

Интересно, как настроить проверку сертификата 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...