java - 来自 Linux 客户端的请求出现 SPNEGO/Kerberos No credential found 错误

标签 java linux tomcat kerberos spnego

我目前正在为客户实现基于 Java、Tomcat 和 Kerberos 的单点登录解决方案。 用户将从他们的客户端浏览器访问 Intranet Tomcat 应用程序的 URL,Tomcat 应用程序通过 Kerberos 获取用户的凭据并将他们重定向到实际的 Web 应用程序。 我们客户的环境是充当 KDC 的 Windows AD 服务器和 Linux Tomcat 应用程序服务器的典型混合体。 SSO 功能应该可以从 Windows 和 Linux 客户端使用。这似乎与我在网上找到的大多数答案不同,在这些答案中,人们拥有 Linux Web 应用程序服务器但仅使用 Windows 客户端。

现在,在我的本地设置中,我遇到了一些奇怪的行为。我的开发环境是在 Windows 7 下从 MyEclipse 8.6 运行的 Tomcat 7.0.26。我的测试环境是在 Centos 6 机器上的 Apache Web 服务器后面的 Tomcat 7.0.26 或 7.0.53。我已经正确设置了 AD 服务器,生成了必要的 key 表文件等,一切都在开发环境中顺利运行。我可以使用 IE 和 Firefox 从 Linux 和 Windows 客户端访问 Tomcat 应用程序,Kerberos 身份验证继续进行,我得到正确的重定向。

在测试服务器上部署 Tomcat 应用程序时,这会在尝试从 Windows 客户端登录时继续工作。但是,当我尝试从 Linux 客户端访问测试服务器时(我已从 Linux Mint 13 和 Ubuntu 13.10 尝试过),出现以下错误:

javax.servlet.ServletException: GSSException: No credential found for: 1.3.6.1.5.2.51.3.6.1.5.2.5 usage: Accept net.sourceforge.spnego.SpnegoHttpFilter.doFilter(SpnegoHttpFilter.java:233)

我不得不承认我没有正确理解这条消息。它是否表明客户端提供的凭据存在问题或应用程序服务器与 KDC 协商存在问题?我对这个问题做了一些研究,发现指示的 oid 1.3.6.1.5.2.5 代表 GSS_IAKERB_MECHANISM 而不是我觉得很奇怪的 GSS_KRB5_MECHANISM 或 GS​​S_SPNEGO_MECHANISM。此外,似乎没有其他人遇到完全相同的问题。

我曾尝试从 MIT Kerberos 切换到 Heimdal Kerberos 并返回。我试过Firefox和Chromium,在我切换Tomcat 7.0.26和7.0.53的应用服务器上,问题依然存在。我使用的是最新的 spnego.jar。

现在:从 Linux 调用在 Windows 开发机器上运行的 Tomcat 成功,从 Linux 客户端调用 Linux 应用程序服务器失败,并在两种浏览器中显示相同的错误消息。

对此有什么想法吗?

最佳答案

GSS_IAKERB_MECHANISM 表示客户端无法确定 realm/kdc 来创建服务票证,并要求服务器充当目标 KDC 的中间人。检查 Wireshark 流量。您现在的任务是分析为什么客户端无法为该 SPN 创建服务票证。我在带有 Microsoft KDC 的 FreeBSD 上的 Heimdal 上观察到了这个问题。

所以问题不在于您的 Tomcat 实例。

关于java - 来自 Linux 客户端的请求出现 SPNEGO/Kerberos No credential found 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23759016/

相关文章:

c# - BlockingSenderDestination.sendReceive() UTF-8 问题

java - 如何处理 Jsoup 表单发布请求上的 html 按钮

java - 数据库表 JNDI 名称问题

linux - sh 文件无法正常工作,但 sh 中的命令可以

spring - Pentaho j_spring_security_check 混合内容。 HTTPS 到 HTTP

java - 即使在 apache flink 中实现 AppendTableStream 接口(interface)后仍出现以下错误

c++ - 在 Linux 中使用 fork() 创建多个子节点

php - fopen() : failed to open stream: Permission denied (when path permission is 777)

apache - 使用 SPNEGO/Kerberos 和委派的 Tomcat 身份验证

java - Tomcat:我搞砸了我的 jndi 连接设置还是什么?