【问题标题】:Disable NTLM on Apache HttpClient 4.3.6在 Apache HttpClient 4.3.6 上禁用 NTLM
【发布时间】:2014-12-12 10:59:48
【问题描述】:

我正在尝试为支持 NTLM 和基本身份验证的服务创建一个 HttpClient。在我的情况下,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 问题,它试图做我没有要求的事情,而且真的不这样做'不想让它尝试做...

【问题讨论】:

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


    【解决方案1】:

    不过 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);
    

    【讨论】:

      【解决方案2】:

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

      在 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-17
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 2011-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多