简单的 Kerberos 客户端在 Java?

2022-09-01 01:36:30

像谷歌的Chrome和IE这样的应用程序可以透明地处理Kerberos身份验证;但是,我找不到一个“简单”的Java解决方案来匹配这种透明度。我发现的所有解决方案都需要存在一个krb5.conf文件和一个login.conf文件,上述应用程序的下界似乎需要。

使用 Kerberos SSO 功能构建 Java 应用程序的最佳方式是什么?

[更新]:需要一个客户端解决方案来创建不验证它们的票证。此外,SPNEGO似乎是默认的“包装器”协议,最终将委托给Kerberos,但我也需要能够处理SPNEGO协议。


答案 1

现在有一个简单的解决方案,使用Apache HTTP组件客户端4.5或更高版本。这在 4.5 中仍被标记为实验性,因此您的 milage 可能会有所不同,但这在企业环境中对我来说工作正常。

除了 HC 4.5 客户端 jar 之外,您还需要在类路径上具有 httpclient-win、jna 和 jna-platform jar,如 http-component-client 中提供的那样。然后,构造启用了 Kerberos 的 HC 客户端,如下所示:

CloseableHttpClient httpclient = WinHttpClients.createDefault();

或者使用构建器:

HttpClientBuilder clientBuilder = WinHttpClients.custom();

然后可以在构建客户端之前根据需要进行自定义:

CloseableHttpClient client = clientBuilder.build();

此解决方案无需任何外部配置即可工作,最重要的是解决了内置 JRE 机制中断 Windows 7+ 上具有本地管理员权限的用户的问题。这是可能的,因为 Kerberos 票证是通过 JNA 直接从 SSPI API 检索的,而不是通过 JRE 提供的 GSSAPI。

来自 http 组件团队的示例代码

这一切都得益于Daniel Doubrovkine Timothy WallRyan McKinley的出色工作。


答案 2

添加到David Roussels关于url的回答特定的http基于kerberos身份验证:-

代码之所以有效,是因为目标 SPN(服务器端主体)配置为使用 HTTP/serverhostname.realm..com@DOMAIN.COM。在这种情况下,它将起作用,因为您没有显式设置令牌。URLConnection 在内部使用该 SPN 设置令牌

1 执行步骤(从我之前的答案)来获得一个主题

2 使用 gss api init sec context 生成上下文令牌。此步骤有许多教程

3 Base 64 对令牌进行编码

4 将令牌附加到 urlconnection:-

URL url = new URL("http://myhost/myapp")
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); = 
urlConn.setRequestProperty("Authorization", "Negotiate " + encodedToken);

5 实施特权操作:-

//this internally calls the getInputStream
public class PrivilegedGetInputStream implements PrivilegedExceptionAction<InputStream>

6 将整个内容包装在 Subject.doAs 中

//use prev answer instructions to get subject
Subject.doAs(subject, new PrivilegedGetInputStream(urlConnection)

推荐