Apache HIVE JDBC:如何自定义SSL证书验证?

问题描述 投票:0回答:1

[我想知道如何为Java中的Apache HIVE JDBC驱动程序定制SSL证书验证。这包括启用自签名证书的使用以及忽略其他验证错误。

这是引发错误的代码:

// 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", "[email protected]", "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 Components - Connection Management - 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初始化的。

我在这里想念什么吗?有没有办法设置HIVE实施将使用的JVM范围的标准HTTP Client Factory设置?

java ssl jdbc hive
1个回答
0
投票

[如果有任何安慰,即使version < 3.x,Hive JDBCDefaultHostnameVerifierjar也可以使用。出现同一错误Link

的Github问题
© www.soinside.com 2019 - 2024. All rights reserved.