20
Июл
2017

Java: HTTPS запросы с сертификатами используя HttpClient (двусторонняя аутентификация)

Нужно отправлять GET-запросы на сервер через HTTPS. Для этих целей используется Apache HttpClient 3.1.0

Проблема заключается в том, что серверу требуется сертификат (двусторонняя аутентификация). Мне предоставили два файла: client.cert.pem и client.key.pem, из которых я получил keystore.jks и keystore.p12 при помощи keytool и openssl.

Использую curl я успешно получаю данные с сервера

curl --cert client.cert.pem --key client.key.pem ...

Но в коде мне не удается правильно передать сертификат.

Изучив множество примеров в интернете я при пришел к такому коду:

final char[] JKS_PASSWORD = "password".toCharArray();

SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(
    new File("ssl/keystore.jks"), JKS_PASSWORD, new TrustSelfSignedStrategy()).build();

HttpClient httpsClient = HttpClients.custom().setSSLContext(sslContext).build();
HttpResponse rResponse = httpsClient.execute(new HttpGet(MY_URL));

В этом случае у я получаю исключение:

java.lang.NoSuchMethodError: org.apache.http.impl.client.HttpClientBuilder.setSSLContext(Ljavax/net/ssl/SSLContext;)Lorg/apache/http/impl/client/HttpClientBuilder;

Если же использовать SSLConnectionSocketFactory:

...

SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(
        sslContext,
        new String[] { "TLSv1", "TLSv1.1", "TLSv1.2" },
        null,
        SSLConnectionSocketFactory.getDefaultHostnameVerifier());


HttpClient httpsClient = HttpClients.custom().setSSLSocketFactory(sslSocketFactory).build();
HttpResponse rResponse = httpsClient.execute(new HttpGet(MY_URL));

Выбрасывается:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Я явно что то напутал, но не могу понять что. Любая помощь приветствуется!

Источник: https://ru.stackoverflow.com/questions/694670/java-https-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D1%8B-%D1%81-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%B0%D0%BC%D0%B8-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8F-httpclient-%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8F%D1%8F-%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8

Share

Тебе может это понравится...