[我想知道如何为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设置?
[如果有任何安慰,即使version < 3.x
,Hive JDBCDefaultHostnameVerifier
jar也可以使用。出现同一错误Link