【发布时间】:2017-10-16 13:57:37
【问题描述】:
我有一些 Linux 和 Windows 服务器的环境。身份验证由 Kerberos 处理。我想做一些 JAVA 代码,它会自动验证它发出的 http 请求是由执行程序的登录用户完成的。
例如,如果我有这个代码:
CloseableHttpClient winHttpclient = WinHttpClients.createDefault();
HttpGet httpget = new HttpGet("http://mykerberos/endpoint");
winHttpclient.execute(httpget).getEntity();
当我从 Windows 执行它时,它开箱即用。我被http://mykerberos/endpoint 识别并得到回复。
现在,我想在 Linux 服务器上做同样的事情。 我找到了一些建议,例如 https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/lab/part6.html#Proxy_Authentication,但这不是我要寻找的,因为它需要我的凭据:在 Windows 中,我什至不必通过它们。
有人知道我如何做到这一点吗?
提前感谢您的帮助!
【问题讨论】:
-
您的 Windows 凭据(我猜)是由 Active Directory 服务器授予的 Kerberos 票证; Web 服务器也(我猜)使用 AD 进行身份验证,这就是 SPNego 协议的用途。但是您的 Linux 凭据是什么? Didi 您使用本地 Linux 帐户登录,还是使用您在 Windows 中使用的同一个 AD 帐户登录(例如通过 SSSD 或 Centrify 完成绑定)?
-
您好,感谢您的回复。你是对的,当我们登录到 Windows 时,我们会得到一个 kerberos 票证,是的,Web 服务器正在使用我们的 AD 服务器进行身份验证。使用 SPNego 协议进行身份验证。我们在 Linux 上使用相同的帐户。我不知道使用哪个工具将它们绑定到我们的 AD。我检查了一下,当我登录 linux 主机时,klist 给我返回了一张票。
-
如果您的 Kerberos 票证缓存中有一个有效的 TGT,那么任何体面的 HTTP 客户端(即支持 SPNego)都应该能够连接。包括
curl命令行实用程序和--negotiate -u : -
警告:当谈到 SPNego 时,Apache HTTP 客户端的名声不好;开发 Java 应用时,请坚持使用默认库。
-
我已成功尝试
curl -u : --negotiate http://...。在 Java 中,我尝试遵循:docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/… 并且出现此错误: Debug is true storeKey false useTicketCache true useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass 为 false clearPass 为 false 从缓存中获取 TGT >>>KinitOptions 缓存名称为 /tmp/krb5cc_0 Principal 为 null 来自 Ticket Cache 的 null 凭据
标签: java linux single-sign-on kerberos