【问题标题】:Issue with SSL certificate incorporation in JEST elastic search rest java APIJEST 弹性搜索 rest java API 中的 SSL 证书合并问题
【发布时间】:2017-04-13 17:41:44
【问题描述】:

我在使用 Jest API 连接到 elasticsearch(ELK) 时遇到问题。我正在为 ELK 寻找基于 rest 的 java API,它支持 SCROLL 和 SCAN,还支持基于证书的身份验证。

我发现 Jest 和 Flummi 是可用的。

由于 Jest 很受欢迎并且有更多的支持,我正在尝试使用它。

我的 ELK db 需要一个证书进行身份验证,我已在个人证书中安装了该证书。

我的问题是如何使用 Jest Client 使用证书进行 Http 请求?我找到了一些代码,但它对我有帮助。我的代码如下。

    package pkg;

      import io.searchbox.core.*;

      import com.google.gson.JsonArray;
      import org.elasticsearch.index.query.QueryBuilders;
      import org.elasticsearch.search.builder.SearchSourceBuilder;

      import org.apache.http.conn.ssl.NoopHostnameVerifier;
      import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
      import org.apache.http.ssl.SSLContextBuilder;
      import org.apache.http.ssl.TrustStrategy;
      import org.apache.http.nio.conn.SchemeIOSessionStrategy;
      import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;

      import java.security.KeyManagementException;
      import java.security.KeyStore;
      import java.security.KeyStoreException;
      import java.security.NoSuchAlgorithmException;
      import java.security.NoSuchProviderException;
      import java.security.cert.CertificateException;

      import javax.net.ssl.HostnameVerifier;
      import javax.net.ssl.SSLContext;

      import java.io.IOException;

      import io.searchbox.client.JestClient;
      import io.searchbox.client.JestClientFactory;
      import io.searchbox.client.JestResult;
      import io.searchbox.client.config.HttpClientConfig;

      import io.searchbox.params.Parameters;


      public class ScrollELK {

        private static final String INDEX = "daivb-logs";
        private static final String TYPE = "cep";

        public void scroll() throws IOException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, NoSuchProviderException {     

        //SSL certificate incorporation         
        SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() 
           {  @java.lang.Override
            public boolean isTrusted(java.security.cert.X509Certificate[] x509Certificates, java.lang.String s) throws CertificateException {
                               return false;}
             }).build();

       // skip hostname checks
            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
            SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
            SchemeIOSessionStrategy httpsIOSessionStrategy = new SSLIOSessionStrategy(sslContext, hostnameVerifier);

             // Get Jest client
            HttpClientConfig clientConfig = new HttpClientConfig                    
                    .Builder("https://***.net/")        
                    .multiThreaded(true)
                    .connTimeout(2000) 
                    .defaultSchemeForDiscoveredNodes("https")                   
                    .sslSocketFactory(sslSocketFactory)
                    .httpsIOSessionStrategy(httpsIOSessionStrategy)
                    .build();

            JestClientFactory factory = new JestClientFactory();
            factory.setHttpClientConfig(clientConfig);
            JestClient client = factory.getObject();


            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());               
            Search search = new Search.Builder(searchSourceBuilder.toString())
                    .addIndex(INDEX)
                    .addType(TYPE)                
                    .setParameter(Parameters.SIZE, 100)
                    .setParameter(Parameters.SCROLL, "5m")
                    .setParameter(Parameters.SEARCH_TYPE, "scan")                   
                    .build();
            JestResult result = client.execute(search);

            JsonArray hits = result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits");
            String scrollId = result.getJsonObject().get("_scroll_id").getAsString();
            int count =0;
           do
           {     SearchScroll scroll = new SearchScroll.Builder(scrollId, "5m")                     
                            .build();
                result = client.execute(scroll);       

                hits = result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits");
                scrollId = result.getJsonObject().getAsJsonPrimitive("_scroll_id").getAsString();
                count =result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits").size();                
                System.out.println(count); 

            }while(count>0);     


            // clear a single scroll id
            ClearScroll clearScroll = new ClearScroll.Builder().addScrollId(scrollId).build();
            result = client.execute(clearScroll);          
        }  
}

请就这个问题提出建议。

【问题讨论】:

  • 您是否遇到了一些错误/异常情况?
  • 是的,我收到以下错误。 i.stack.imgur.com/jkqHI.png
  • 我认为这是不正确的屏幕截图,但我注意到 SSLException,您可以在您的问题中添加异常文本吗?

标签: java rest elasticsearch ssl elasticsearch-jest


【解决方案1】:
private SSLContext createSSLContext() {
        try {
            SSLContextBuilder sslBuilder = SSLContexts.custom().loadTrustMaterial(null, (x509Certificates, s) -> true);
            final SSLContext sslContext = sslBuilder.build();
            return sslContext;
        } catch (Exception e) {
            LOGGER.error("cannot create SSLContext", e);
        }
        return null;
}

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 2019-02-15
    • 1970-01-01
    • 2017-08-23
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多