此问题在此处已有答案:
"PKIX path building failed" and "unable to find valid certification path to requested target"(58回答)
上个月关门了。
这篇文章是编辑并提交审查20天前.
我正在尝试连接运行在GCP VM环境中的Elasticsearch远程服务器(受SSH保护)。我有运行Elasticsearch的GCP VM示例生成的http_ca.crt
证书。
- 我显示了证书的路径,然后Java无法读取文件,之后我将证书添加到
keystore
。仍然得到错误:
Failed to connect to Elasticsearch server. Exception: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
字符串
- 源代码如下:
public class ElasticsearchSSHconnection {
private static TrustManager[] trustManager;
public static void main(String[] args) throws Exception {
String host = "HOST-IP";
int port = 9200;
String username = "USERNAME";
String password = "PASSWORD";
String caCertificatePath = "C:\\Users\\user\\Downloads\\http_ca\\http_ca.crt";
SSLContext sslContext = createSSLContextWithCA(caCertificatePath);
BasicCredentialsProvider credsProv = new BasicCredentialsProvider();
credsProv.setCredentials(
AuthScope.ANY, new UsernamePasswordCredentials(username, password)
);
RestClientBuilder restClientBuilder = RestClient
.builder(new HttpHost(host, port, "https"))
.setHttpClientConfigCallback(httpClientBuilder -> {
httpClientBuilder.setSSLContext(sslContext)
.setDefaultCredentialsProvider(credsProv);
// Disable hostname verification
httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);
return httpClientBuilder;
});
RestHighLevelClient client = new RestHighLevelClient(restClientBuilder);
try {
client.ping(RequestOptions.DEFAULT);
System.out.println("Connection to Elasticsearch server is SUCCESSFUL.");
} catch (IOException e) {
System.out.println("Failed to connect to Elasticsearch server. Exception: " + e.getMessage());
} finally {
client.close();
}
}
private static SSLContext createSSLContextWithCA(String caCertificatePath) throws Exception {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream truststoreInputStream = new FileInputStream("C:\\Windows\\System32\\truststore.jks");
trustStore.load(truststoreInputStream, "PASSWORD".toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManager, null);
return sslContext;
}
}
型
1条答案
按热度按时间tquggr8v1#
我自己张贴的答案,我发现的解决方案似乎是工作!
http_ca.crt
证书文件。实际上Java运行时无法读取,因为它不受信任。truststore
中:字符串
RestHighLevelClient
。我同时使用http_ca.crt
和truststore.jks
。在没有意识到这一点的情况下,我已经将SSL证书文件移动到了Java truststore。然后我对Java客户端做了一些修改,一切都很好:型
x1c 0d1x的数据