在JEST弹性搜索其余Java API中使用SSL证书合并的问题

时间:2016-11-29 16:22:35

标签: java rest ssl elasticsearch jest

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

我发现Jest和Flummi是可用的。

由于Jest很受欢迎且有更多支持,我正试图使用​​它。

我的ELK数据库需要一个身份验证证书,我已在个人证书中安装。

我的问题是如何使用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);          
        }  
}

请问这个问题。

1 个答案:

答案 0 :(得分:0)

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;
}