我正在尝试设置一个 http 客户端以使用 spnego 进行身份验证(apache http 客户端 4.5.2)
这是设置客户端的代码
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
final CredentialsProvider credsProvider = new SystemDefaultCredentialsProvider();
credsProvider.setCredentials(new AuthScope(null, -1, null), new KerberosCredentials(null));
final HttpClientBuilder builder = HttpClientBuilder.create();
builder.setDefaultCredentialsProvider(credsProvider);
final ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(builder.build());
final Client client = new ResteasyClientBuilder().httpEngine(engine).build();
在服务器上,我有一个 JAX-RS 服务,它位于 a 后面waffle.servlet.NegotiateSecurityFilter
以允许 ntlm 或 spnego 身份验证。
当我从我的 chrome rest 客户端发送我的 HTTP 请求时,它可以工作,使用协商成功完成身份验证。
但是,当我尝试使用 apache http 客户端时,它会失败并显示日志中的消息:
2018-03-05 16:47:16,048 DEBUG o.a.h.impl.auth.GGSSchemeBase main Authentication already attempted
2018-03-05 16:47:16,048 DEBUG o.a.h.i.auth.HttpAuthenticator main Authentication failed
经过一些进一步的调查,我发现华夫饼过滤器正在遇到GSS_S_CONTINUE_NEEDED
一个额外的挑战并做出响应,而 apache 客户端只是忽略并放弃了这个挑战。
我已经针对另一个使用 spnego(由第 3 方提供)的服务测试了我的 apache 客户端设置,它可以正常工作,尽管没有使用 continue 令牌。
我不确定我的系统是否设置不正确,是否不应该发生 continue 令牌,或者 apache http 客户端是否配置不正确(或根本不支持 continue 令牌)
这里有一张非常旧的票https://issues.apache.org/jira/browse/HTTPCLIENT-1107表明添加了一些东西来处理额外的挑战,但是从阅读其中的代码org.apache.http.impl.auth.GGSSchemeBase.parseChallenge(CharArrayBuffer, int, int)
看起来好像只有第一个挑战被接受.