【问题标题】:How to validate a Kerberos ticket against a server in Java?如何针对 Java 中的服务器验证 Kerberos 票证?
【发布时间】:2011-01-14 22:00:11
【问题描述】:

我们正在使用 JAAS 在使用 Windows Kerberos 票证缓存的 Java 应用程序中启用单点登录。我们的 jaas.conf 配置文件如下所示:

LoginJaas {
  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=true
  doNotPrompt=true
  debug=true;
};

这样,我们就可以创建一个 Jaas LoginContext 并成功获取用户的 Kerberos 票证。我们使用 JMI 将此票证发送到服务器应用程序。但我们无法做到的是在服务器上验证 Kerberos 票证实际上是由我们的 Active Directory 创建的。

目前,我们通过简单地检查服务器主体 (KerberosTicket.getServer()) 名称是否在领域部分中有我们的域名来对票证进行非常不安全的验证。但当然,任何人都可以使用相同的域名设置自己的 Kerberos 服务器,并使用该票证来启动应用程序。

我发现的一个想法是使用 Kerberos 票证针对 Active Directory LDAP 进行身份验证。不幸的是,我们使用 Windows 7 并重新使用 Kerberos 票证对 LDAP 进行身份验证仅在设置注册表条目时有效(请参阅http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html,搜索 allowtgtsessionkey)。这是我们的用户无法接受的。

有什么方法可以根据我们的 Active Directory 服务器验证票证吗?我怀疑有一种方法可以检查 KerberosTicket.getServer() 票证是否等于我们服务器的票证,但我不知道该怎么做。更新:KerberosTicket().getServer() 只返回一个 KerberosPrincipal,它只包含服务器票证名称和领域,因此不适合验证。

感谢您的帮助, 追忆者

【问题讨论】:

    标签: java active-directory single-sign-on kerberos jaas


    【解决方案1】:

    正如您所提到的,解决此问题的正确方法是对您的服务进行 kerberize,这是 Kerberos 协议的全部要点(针对服务器验证客户端)。票证重用并不完全有效,因为如果这样做将是一个安全问题。 Kerberos 服务不需要“登录到 Active Directory”,它只需要与 AD 共享密钥。

    顺便说一句,要使用 JAAS 获得 SSO 需要设置 allowtgtsessionkey,在 Windows 上无法解决。

    【讨论】:

    • 请注意,带有拉丁字符的 Active Directory 用户名在 JAAS 的 Kerberos 登录模块中不起作用。除非系统仅为 US-ASCII,否则存在重大限制。
    【解决方案2】:

    由于似乎没有人真正知道这个问题的答案,我想我们必须从我们的服务器应用程序中创建一个适当的 Kerberos 服务。登录到 Active Directory 本身并且正确设置了 ServicePrincipalName 属性的一种。有点像 SPNEGO 对 HTTP 所做的。一个很好的起点是 SourceForge 上的 SPNEGO Servlet 过滤器 (http://spnego.sourceforge.net/)。 http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html 也是如何进行服务登录的一个很好的例子。 不幸的是,这导致了与注册表项相同的问题,因此我在Is there a way in Java or a command-line util to obtain a Kerberos ticket for a service using the native SSPI API? 上发布了一个新问题。

    【讨论】:

    • 你有想过这个吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多