首页 > 解决方案 > 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 提供的证书工具。

步骤如下:

  1. 生成 CA:bin/elasticsearch-certutil caENTER ENTER
  2. 从此 CA 生成证书:bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12ENTER ENTER ENTER

(都没有密码生成)

  1. 在 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

  2. 定义的用户密码:bin/elasticsearch-setup-passwords interactive
  3. 生成客户端证书(这部分我还是不太明白):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 存储)。

标签: javaelasticsearchsslssl-certificate

解决方案


推荐阅读