Как вызвать веб-сервис SOAP, используя httpclient с SSL - PullRequest
0 голосов
/ 15 мая 2018

ПОМОГИТЕ СЕЙЧАС, Я хочу вызвать API через SOAP и использовать httpclient 4.5.5

Мой код

static String callApi(String url, String requestXml)
{
    String responseXml = "";        
    CloseableHttpClient httpClient = null;
    HttpPost httpPost;
    try
    {
        httpClient = HttpClients.createDefault();
        httpPost = new HttpPost(url);

        httpPost.setHeader("Content-Type", "text/xml; charset=utf-8");
        httpPost.setHeader("x-ibm-client-id", Config.csp.validKey);

        StringEntity entiry = new StringEntity(requestXml, "UTF-8");

        httpPost.setEntity(entiry);

        HttpResponse response = httpClient.execute(httpPost);

        HttpEntity entity = response.getEntity();
        responseXml = EntityUtils.toString(entity, "UTF-8");

    }
    catch (Exception ex)
    {
        log.error("", ex);
    }
    finally
    {
        try
        {
            if (httpClient != null)
                httpClient.close();
        }
        catch (Exception ex)
        {
            log.error("", ex);
        }
    }
    return responseXml;
}

А когда я отлаживаю, то показываю ошибку

javax.net.ssl.SSLPeerUnverifiedException: сертификат для <10.xx.xx.xx> не соответствует ни одному из альтернативных имен субъекта: [* .domain.vn, domain.vn] в org.apache.http.conn.ssl.SSLConnectionSocketFactory.verifyHostname (SSLConnectionSocketFactory.java:467) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket (SSLConnectionSocketFactory.java:397) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket (SSLConnectionSocketFactory.java:355) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect (DefaultHttpClientConnectionOperator.java:142) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect (PoolingHttpClientConnectionManager.java:373) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.impl.execchain.MainClientExec.establishRoute (MainClientExec.java:381) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.impl.execchain.MainClientExec.execute (MainClientExec.java:237) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.impl.execchain.ProtocolExec.execute (ProtocolExec.java:185) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.impl.execchain.RetryExec.execute (RetryExec.java:89) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.impl.execchain.RedirectExec.execute (RedirectExec.java:111) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.impl.client.InternalHttpClient.doExecute (InternalHttpClient.java:185) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.impl.client.CloseableHttpClient.execute (CloseableHttpClient.java:83) ~ [httpclient-4.5.5.jar: 4.5.5] в org.apache.http.impl.client.CloseableHttpClient.execute (CloseableHttpClient.java:108) ~ [httpclient-4.5.5.jar: 4.5.5]

Пожалуйста, помогите. большое спасибо

1 Ответ

0 голосов
/ 15 мая 2018

Вы не показываете, как звоните callApi(), но я предполагаю, что вы обращаетесь к своему хосту с IP-адресом 10.xx.xx.xx вместо одного из имен, содержащихся в его сертификате.

Вы не можете сделать это, когда действует проверка имени хоста.

Желательно, чтобы вы обратились к нему по общему имени сертификата или одному из дополнительных имен субъекта (SAN). Однако, если вы не можете сделать это, и поскольку диапазон IP-адресов 10.* является частной сетью, вы, вероятно, можете отключить проверку имени хоста для этого межсерверного вызова.

Вместо этого ...

httpClient = HttpClients.createDefault();

Сделай это ...

httpClient = HttpClients
               .custom()
               .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
               .build();

Синтаксис может немного отличаться в зависимости от используемой версии Apache HttpClient.

ЭТО ОТКЛЮЧАЕТ КОНТРОЛЬ БЕЗОПАСНОСТИ. НЕ ДЕЛАЙТЕ ЭТОГО КОГДА ВЫЗЫВАЕТ ХОСТЫ В СЕТЯХ, ВЫ НЕ УПРАВЛЯЕТЕ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...