У HttpClient настроена проверка подлинности SSL и прокси? - PullRequest
2 голосов
/ 08 мая 2020

У меня есть два фрагмента кода с использованием HttpClient,
Первая часть на случай, если конечная точка требует SSL
Вторая - прокси-соединение с базой c аутентификация
Мой вопрос: как я могу сделать этот код условно, поэтому в тех случаях, когда у меня есть SSL + Proxy или только SSL, мне трудно понять, как установить учетные данные по умолчанию, например, после того, как я создал клиента, используя клиент в части SSL

.setDefaultCredentialsProvider(credsProvider)

Эта часть как я создаю клиента, когда мне нужен SSL

CloseableHttpClient client = null;

    if(conf.isUseSslConfig()) {         
        SSLContext sslcontext = SSLContexts.custom()
                    .loadTrustMaterial(new File(conf.getTrustStoreLocation()), conf.getTrustStorePassword().toCharArray(), new TrustSelfSignedStrategy()).build();

            // Allow protocols
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,conf.getTlsVersions(), null,
                    SSLConnectionSocketFactory.getDefaultHostnameVerifier());               
            client = HttpClients.custom().setSSLSocketFactory(sslsf).build();


        }else {
            client= HttpClients.createDefault();                
        }

И в этой части я создаю клиента, когда мне нужна проверка подлинности прокси:

if(conf.isUseProxyConfig()){
    CredentialsProvider credsProvider = new BasicCredentialsProvider();        
    credsProvider.setCredentials(
            new AuthScope("fakeProxy.xerox.com", 80),
            new UsernamePasswordCredentials("xeroxUser","fakePassword123"));

HttpClients.custom()
            .setDefaultCredentialsProvider(credsProvider).build();
         }

Итак, суть в том, как сделать два раздела работают вместе, поэтому в случае

  1. Звонок с SSL + прокси и аутентификация
  2. Звонок только с SSL
  3. Звонок только с прокси и аутентификацией

1 Ответ

1 голос
/ 18 мая 2020

Вы можете написать код таким образом, чтобы разрешить несколько условий:

CloseableHttpClient client = null;

    if(conf.isUseSslConfig() && conf.isUseProxyConfig()) {         

            setSSLSetting(client);
            setProxy()

        }else  if(conf.isUseSslConfig()) {

        setSSLSetting(client);
        }else {
            client= HttpClients.createDefault();                
        }


private void setProxy(){
    CredentialsProvider credsProvider = new BasicCredentialsProvider();        
    credsProvider.setCredentials(new AuthScope("fakeProxy.xerox.com", 80),new UsernamePasswordCredentials("xeroxUser","fakePassword123"));
}       


private void setSSLSetting(CloseableHttpClient client){
        SSLContext sslcontext = SSLContexts.custom()
                    .loadTrustMaterial(new File(conf.getTrustStoreLocation()), conf.getTrustStorePassword().toCharArray(), new TrustSelfSignedStrategy()).build();

            // Allow protocols
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,conf.getTlsVersions(), null,
                    SSLConnectionSocketFactory.getDefaultHostnameVerifier());               
            client = HttpClients.custom().setSSLSocketFactory(sslsf).build();
}

или вы можете создать методы, возвращающие клиента с другими настройками и конфигурациями, например:


    final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", new PlainConnectionSocketFactory()).register("https", sslsf).build();

    final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);

    private CloseableHttpClient createHttpClient(String headerName, String value) throws NoSuchAlgorithmException, KeyManagementException,KeyStoreException {
        SSLContextBuilder builder = new SSLContextBuilder();
        builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
        Header header = new BasicHeader(headerName,value);
        List<Header> headers = new ArrayList<>();
        headers.add(header);
        RequestConfig reqConfig = RequestConfig.custom().setConnectionRequestTimeout(long milli seconds).build();

        CloseableHttpClient httpclient = HttpClients.custom().
                setDefaultHeaders(headers).
                setDefaultRequestConfig(reqConfig).
                setConnectionManager(cm).
                build();
        return httpclient;
    }
...