在Apache HttpClient 4.3.6上禁用NTLM

时间:2014-12-12 10:59:48

标签: java http apache-httpclient-4.x

我正在尝试将HttpClient创建为支持NTLM和Basic身份验证的服务。在我的情况下,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 tgt))   严重:[WARN] HttpAuthenticator - NTLM身份验证错误:凭据不能用于NTLM身份验证:org.apache.http.auth.UsernamePasswordCredentials

我只是希望它发送HTTP Authentication: Basic ...标头。我已经在任何Java HTTP框架之外测试了这个(例如使用带有手动创建的HTTP请求的原始ssl套接字),所以它似乎是一些Java / Apache HTTP问题,它尝试做我没有要求的事情并且真的不要&# 39;不想让它甚至尝试......

2 个答案:

答案 0 :(得分:7)

  

然而,无论如何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基于每个请求选择基于NTLM的BASIC

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

答案 1 :(得分:0)

这不是一个完整的答案,而是更多的指针:

在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