我正在尝试设置一个http客户端来验证spnego(apache http client 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服务,它位于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(由第三方提供)的另一项服务测试了我的apache客户端设置,并且它正常工作,但不使用continue令牌。
我不确定我的系统是否设置不正确,并且不应该发生继续令牌,或者apache http客户端配置不正确(或者根本不支持继续令牌)
这里有一张非常旧的票据https://issues.apache.org/jira/browse/HTTPCLIENT-1107表示已经添加了一些东西来处理其他挑战,但是通过阅读org.apache.http.impl.auth.GGSSchemeBase.parseChallenge(CharArrayBuffer, int, int)
中的代码,它看起来好像只接受了第一个挑战。