java - Elasticsearch 7.2 java 客户端 SSL 配置失败:bad_certificate
问题描述
在将我的 elasticsearch 更新到 7.2 并更新 kibana 并启用安全性和 SSL 之后,我的 java (spring) 应用程序失去了与它的连接。Spring JPA 仍然不支持 ES 7,security+SSL 是一个付费插件,现在它是基本免费包的一部分。
因此,我一直在尝试配置我自己的客户端以使用 elasticsearch SDK 提供的 RestHighLevelClient 发送请求。为开发模式打开 SSL 后,我已经能够连接并创建我的索引,但是一旦打开它,我就无法让它工作。
我按照教程设置了一个有效的自签名证书来使用它。本教程使用随 elasticsearch 提供的证书工具。
步骤如下:
- 生成 CA:
bin/elasticsearch-certutil ca
ENTER ENTER - 从此 CA 生成证书:
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
ENTER ENTER ENTER
(都没有密码生成)
在 ES 配置文件 (elasticsearch.yml) 中安装证书:
xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode:certificate xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore .path:证书/弹性证书.p12- 定义的用户密码:
bin/elasticsearch-setup-passwords interactive
- 生成客户端证书(这部分我还是不太明白):
bin/elasticsearch-certutil cert --ca config/certs/elastic-stack-ca.p12 -name "CN=xyz,OU=XXX Team,DC=mydomain,DC=com"
ENTER client.p12 ENTER ENTER
在这些步骤之后,由于 ES 运行良好,我开始创建连接到 ES 服务器的 java 部分。
为此,我实例化了一个 Keystore:KeyStore truststore = KeyStore.getInstance("PKCS12");
然后我从类路径加载了我的客户端证书(client.p12):
try (InputStream resource = new ClassPathResource(keystorePath).getInputStream()) {
truststore.load(resource, new char[] {});//keystore pass is empty
} catch (NoSuchAlgorithmException | CertificateException | IOException e) {
log.error(e.getMessage(), e);
}
然后我构建了一个 SSL 上下文,如下所示:
sslBuilder = SSLContexts.custom().loadTrustMaterial(truststore, new TrustSelfSignedStrategy());
最后,从那个上下文中,我创建了我的 rest 客户端构建器(我用它来创建我的 RestHighLevelClient:
RestClientBuilder builder = RestClient.builder(
new HttpHost(elasticAddress, elasticPort, "https"))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setSSLContext(sslContext));
return new RestHighLevelClient(builder);
我遇到的问题是当我尝试连接时。在我的 java 客户端中,我得到了这个异常:
javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
在弹性中我得到这个异常: 引起:javax.net.ssl.SSLHandshakeException: null cert chain
elasticsearch 文档说,当这些异常发生时,问题是: SSLHandshakeException 表示客户端返回了一个不受信任的自签名证书,因为它在信任库或密钥库中找不到。在连接的客户端可以看到此 SSLException。
但它没有解释如何解决这个问题。我已经按照官方 7.2 文档教程进行证书生成以及 java 设置(他们作为示例提供的代码不起作用,并且使用了他们没有解释如何生成的 JKS 存储)。
解决方案
推荐阅读
- javascript - 如何循环事件单击获取每个a的属性?
- sql - 您可以在 Presto / Athena 中为 AT TIME ZONE 的时区参数使用一列吗?
- maven - 使用工件 id 在 springboot 应用程序中设置的默认 url
- php - 一台带有 nginx 的服务器中的多个 wordpress
- rabbitmq - RabbitMQ 配置为使用自定义的 epmd 端口,但服务器仍然在默认的 epmd 进程上启动
- python - 当随机数达到0时如何结束循环
- java - 休眠搜索 lucene 消耗数据库连接
- python - 使用 python 在 Azure Functions 中进行路由
- javascript - 将 JSON 数据输出到从 FireBase 数据库中提取的道具中
- r - 使用 dplyr (或其他东西)在 R 中重新编码