Resttemplate с 2-х сторонним сертификатом SSL - PullRequest
0 голосов
/ 10 мая 2018

Я использую rettemplate для обращения к стороннему URL, который использует двухсторонний ssl-сертификат. я установил httpclient с хранилищем доверенных сертификатов и хранилищем ключей все еще получая исключение рукопожатия ssl. Я также пытался после импорта сертификата в моих каскарах, но все еще не повезло. Любой, кто использовал 2 way ssl с resttemplate

private HttpClient createHttpClient(final String keyAlias) {
    logger.info("Creating HTTP client using keystore={} and alias={}", keyStorePath, keyAlias);
    final KeyStore trustStore = new KeyStoreFactoryBean(makeResource(keyStorePath), keyStoreType, keyStorePassword)
            .newInstance();
    KeyStore keyStore = 
            new KeyStoreFactoryBean(makeResource(keyStorePath), keyStoreType, keyStorePassword)
            .newInstance();
    final SSLContext sslContext;
    HttpHost proxyNew = null;
    proxyNew = new HttpHost(proxyURL, proxyPort);
    HttpClient httpClient=null;
    try {


        sslContext = SSLContexts.custom()
                .loadKeyMaterial(keyStore, keyStorePassword.toCharArray(), (aliases, socket) -> keyAlias)
                .loadTrustMaterial(trustStore, (x509Certificates, s) -> false).build();
        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build());

    } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | UnrecoverableKeyException e) {
        throw new IllegalStateException("Error loading key or trust material", e);
    }
    final SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,
            new String[] { "TLSv1.2", "TLSv1.1" }, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
    final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create()
            .register("http", PlainConnectionSocketFactory.getSocketFactory()).register("https", sslSocketFactory)
            .build();
    final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
    connectionManager.setMaxTotal(httpClientPoolSize);
    connectionManager.setDefaultMaxPerRoute(httpClientPoolSize);
    HttpHost proxy = null;
    proxy = new HttpHost(proxyURL, proxyPort);

    if(isProxy)
        return HttpClients.custom().setSSLSocketFactory(sslSocketFactory).setConnectionManager(connectionManager).setProxy(proxy).build();
    return HttpClients.custom().setSSLSocketFactory(sslSocketFactory).setConnectionManager(connectionManager).build();

}
...