ElasticSearch安全模式:创建RestHighLevelClient 连接SSL认证的HTTPS ES集群

一、问题场景

在Elasticsearch 6.5以上版本中提供了安全模式,开启安全模式后需要输入用户名和密码,同时使用ssl https方式才能连接集群进行相关操作。

二、解决方式1 - RestHighLevelClient方式

使用官方提供RestHighLevelClient作为客户端进行连接集群以及相关操作的实现。其中使用HttpHost类负责http请求,并在HttpHost类中将CredentialsProvider和SSLIOSessionStrategy配置参数类封装在自定义的SecuredHttpClientConfigCallback类配置请求连接参数。代码如下创建RestHighLevelClient

    public RestHighLevelClient restClient() {
        LOGGER.info("Elasticsearch init start ......");
        RestHighLevelClient restClient = null;
        try {
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY,
                    new UsernamePasswordCredentials(username, password));

            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                // 信任所有
                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    return true;
                }
            }).build();
            SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(sslContext, NoopHostnameVerifier.INSTANCE);
            restClient = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost(hostName, port, scheme))
                            .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                                public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                                    httpClientBuilder.disableAuthCaching();
                                    httpClientBuilder.setSSLStrategy(sessionStrategy);
                                    httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                                    return httpClientBuilder;
                                }
                            }));
        } catch (Exception e) {
            LOGGER.error("elasticsearch TransportClient create error!!", e);
        }
        return restClient;
    }
三、解决方式2 - Apache HttpClient 方式

使用httpclient方式访问https ES集群需要ssl认证和创建sslClient方式,代码如下:

//创建ssl client
public CloseableHttpClient sslClient() {
        LOGGER.info("HttpClient init start ......");
        CloseableHttpClient sslClient = null;
        // 用户认证提供者
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(username, password));
        try {
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                // 信任所有证书,本地证书
                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    return true;
                }
            }).build();
            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
            sslClient = HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultCredentialsProvider(credentialsProvider).build();
        } catch (Exception e) {
            LOGGER.error("HttpClient create error!!", e);
        }
        if (sslClient != null) {
            return sslClient;
        }
        return sslClient;
    }

总结:如果需要通过ElasticSearch安全模式的认证,需要注意两点:信任本地证书,也就是创建SSLContext  和 如果同时有账号密码认证,需要添加CredentialsProvider。

另外ElasticSearch也有通过安全证书连接的方式,大家可以查询ElasticSearch文档得到解决.

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
连接开启了SSLElasticsearch集群,需要使用Java的TransportClient,并使用SSLContext来设置SSL连接。以下是一个简单的示例代码: ```java import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.transport.client.PreBuiltTransportClient; import javax.net.ssl.SSLContext; import java.net.InetAddress; import java.security.KeyStore; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class ESClient { public static void main(String[] args) throws Exception { Settings settings = Settings.builder() .put("cluster.name", "myClusterName") .put("xpack.security.user", "myUsername:myPassword") .put("xpack.security.transport.ssl.enabled", true) .put("xpack.security.transport.ssl.verification_mode", "certificate") .put("xpack.security.transport.ssl.keystore.path", "/path/to/keystore.jks") .put("xpack.security.transport.ssl.truststore.path", "/path/to/truststore.jks") .build(); SSLContext sslContext = SSLContext.getInstance("TLS"); KeyStore keyStore = KeyStore.getInstance("jks"); KeyStore trustStore = KeyStore.getInstance("jks"); keyStore.load(ESClient.class.getResourceAsStream("/path/to/keystore.jks"), "keystore_password".toCharArray()); trustStore.load(ESClient.class.getResourceAsStream("/path/to/truststore.jks"), "truststore_password".toCharArray()); TrustManager[] trustManagers = new TrustManager[] { new X509TrustManager() { public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {} public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }}; sslContext.init(null, trustManagers, new SecureRandom()); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300)) .setSSLContext(sslContext); XContentBuilder builder = XContentFactory.jsonBuilder(); builder.startObject().field("name", "John").endObject(); client.prepareIndex("myindex", "mytype", "1") .setSource(builder) .get(); client.close(); } } ``` 在这个示例代码中,我们首先使用Elasticsearch的TransportClient创建了一个连接,然后设置了连接ES集群所需的一些参数。其中,`xpack.security.user`参数是用于认证的用户名和密码,`xpack.security.transport.ssl.enabled`参数设置为`true`表示开启SSL连接,`xpack.security.transport.ssl.verification_mode`参数设置为`certificate`表示只信任CA签署的证书。最后,我们设置了keystore和truststore的路径,并使用SSLContext将其加载。 接下来,我们使用TransportClient发送了一个简单的索引请求,将一个JSON文档插入到名为`myindex`、类型为`mytype`、ID为`1`的索引中。 注意,这只是一个简单的示例,实际应用中还需要根据实际情况进行配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值