Apache http client для запросов с сертификатом

Казалось бы, такая тривиальная задача, есть сертификат в контейнере p12, пароль от него, и URL через https. Но чтобы это взлетело повозиться всё же приходится:

private CloseableHttpClient buildSSLClient()
           throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {

  KeyStore keyStore = KeyStore.getInstance("PKCS12");
  try (InputStream in = Files.newInputStream(Paths.get(certPath))) {
      keyStore.load(in, certPass.toCharArray());
  }

  SSLContextBuilder sslContextBuilder = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true);
  sslContextBuilder.loadKeyMaterial(keyStore, certPass.toCharArray());

  SSLContext context = sslContextBuilder.build();
  SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(context, null, null, NoopHostnameVerifier.INSTANCE);

  final HttpClientBuilder builder = HttpClients.custom();

  final RequestConfig requestConfig = RequestConfig.custom()
                .setConnectionRequestTimeout(TIMEOUT)
                .setConnectTimeout(TIMEOUT)
                .setSocketTimeout(TIMEOUT)
                .build();

  Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("https", socketFactory).build();

  builder.setDefaultRequestConfig(requestConfig);
  builder.setConnectionManager(new BasicHttpClientConnectionManager(registry));

  return builder.build();
}

Где
certPath – путь до серта *.p12
certPass
– пароль от контейнера

Leave a Reply

Your email address will not be published. Required fields are marked *