HttpClient, использующий как SSL-шифрование, так и NTLM-аутентификацию, завершается неудачно - PullRequest
5 голосов
/ 15 марта 2012

Я пытаюсь выполнить простые вызовы REST на сервере Sharepoint 2010, который использует шифрование SSL (https), а также проверку подлинности NTLM.Когда сервер настроен так, чтобы не требовать SSL (только для тестирования, серверу потребуется SSL в работе), моя аутентификация NTLM и последующие вызовы REST работают нормально с использованием HttpClient.Однако, когда SSL включен, аутентификация больше не работает.

Вот код для обработки SSL (настроен на прием всех сертификатов):

    SSLContext sslContext = SSLContext.getInstance("TLS");

    // set up a TrustManager that trusts everything
    sslContext.init(null, new TrustManager[] { new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public void checkClientTrusted(X509Certificate[] certs,
                String authType) { }

        public void checkServerTrusted(X509Certificate[] certs,
                String authType) { }
    } }, new SecureRandom());

    SSLSocketFactory sf = new SSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

    Scheme httpsScheme = new Scheme("https", 443, sf);
    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(httpsScheme);

    ClientConnectionManager cm = new SingleClientConnManager(schemeRegistry);

Затем следует код для выполнения NTML.и HTTP GET call:

    HttpParams params = new BasicHttpParams();

    DefaultHttpClient httpclient = new DefaultHttpClient(cm, params);

            // Set up the NTLM credentials
    NTCredentials creds = new NTCredentials(USERNAME, PASSWORD, MACHINE, DOMAIN);
    httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);

            // Setup the HTTP GET and execute it
    HttpHost target = new HttpHost(HOSTNAME, 443, "https");

    HttpContext localContext = new BasicHttpContext();
    HttpGet httpget = new HttpGet("/site/_vti_bin/ListData.svc/TestList");
    HttpResponse response1 = httpclient.execute(target, httpget, localContext);

Ответ, который я всегда получаю:

 HTTP/1.1 400 Bad Request
 The server encountered an error processing the request. See server logs for more details.

Обратите внимание, что я использовал FireFox Poster и CURL, чтобы делать то же самое, что и я.пытаюсь сделать тут программно, и все работает нормально.Похоже, сервер настроен правильно.

Спасибо за ваше время!

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Документирование этого для других, у кого может быть эта проблема.

Проблема заключалась в том, что сервер IIS был настроен для разрешения анонимного входа. Очевидно, есть ошибка, при которой, если это установлено, любые подключения REST или SOAP к экземплярам sharepoint при этой установке не будут выполнены успешно. Казалось, что строка «анонимный» добавляется в URL-адреса REST / SOAP, что, безусловно, указывает на несуществующую службу. После того, как мы отключили возможность анонимного входа в систему на экземпляре IIS, вызовы сработали.

0 голосов
/ 15 марта 2012

Я предполагаю, что аутентификация NTLM завершается неудачно из-за непостоянных соединений SSL.Схема NTLM требует многократного обмена сообщениями и может работать только с постоянными соединениями.

Если вы разместите проводной / контекстный журнал сеанса HTTP (либо здесь, либо в списке httpclient-users), я смогу объяснить, почему не работают соединения SSL.

...