Отключить NTLM на Apache HttpClient 4.3.6

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

CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
    new UsernamePasswordCredentials(
            username,  password));

HttpClient client = HttpClientBuilder.create()
        .setDefaultCredentialsProvider(credentialsProvider).build();
HttpGet method = new HttpGet(uri);
HttpResponse response = client.execute(method);

Серьезная: [WARN] HttpAuthenticator - Ошибка аутентификации NEGOTIATE: не предоставлены действительные учетные данные (уровень механизма: не предоставлены действительные учетные данные (уровень механизма: не удалось найти какой-либо протокол Kerberos)) Серьезный: [WARN] HttpAuthenticator - Ошибка аутентификации NTLM: учетные данные не могут быть использованы для аутентификации NTLM: org.apache.http.auth.UsernamePasswordCredentials

Я просто хочу, чтобы он отправил заголовок HTTP Authentication: Basic .... Я тестировал это вне любых фреймворков Java HTTP (например, используя необработанный ssl-сокет с вручную созданным HTTP-запросом), поэтому, похоже, это какая-то проблема HTTP Java / Apache, когда он пытается делать то, о чем я не просил и на самом деле не делаю. не хочу даже пытаться это сделать ...


person Fire Lancer    schedule 12.12.2014    source источник


Ответы (2)


Однако похоже, что HttpClient все равно попытается его использовать.

Это связано с тем, что клиенты с хорошим поведением должны выбирать более безопасную схему вместо изначально небезопасной аутентификации BASIC.

Так можно навсегда отключить NTLM (и другие нестандартные схемы)

Registry<AuthSchemeProvider> r = RegistryBuilder.<AuthSchemeProvider>create()
        .register(AuthSchemes.BASIC, new BasicSchemeFactory())
        .register(AuthSchemes.DIGEST, new DigestSchemeFactory())
        .build();
CloseableHttpClient client = HttpClients.custom()
        .setDefaultAuthSchemeRegistry(r)
        .build();

Вот как можно заставить HttpClient выбирать BASIC вместо NTLM для каждого запроса.

RequestConfig config = RequestConfig.custom()
        .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC, AuthSchemes.NTLM))
        .build();
HttpGet get = new HttpGet("/");
get.setConfig(config);
person ok2c    schedule 12.12.2014

Это не полный ответ, а скорее указатель:

В 4.x (см .: http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/AuthSchemeRegistry.html) действует как реестр, вы можете отменить регистрацию NTLM оттуда. (в настоящее время не рекомендуется)

Другой метод может заключаться в использовании вытесняющей HTTP-аутентификации с заголовком авторизации (использование вытесняющей аутентификации спорно).

В 3.x это было проще (см. http://hc.apache.org/httpclient-3.x/authentication.html)

person Ironluca    schedule 12.12.2014