【问题标题】:Java Kerberos ticket renew TGTJava Kerberos 票据更新 TGT
【发布时间】:2012-09-03 04:42:59
【问题描述】:

我在其中一个 POC 中使用 Krb5LoginModule。我提供了 useDefaultCache=true 和 renewTGT=true。

尽管我提到了 renewTGT=true,但当票证过期时,代码会引发异常。我已在 Windows 注册表中将 allowtgtsessionkey 值设置为 1(我正在运行 XP SP2)。 KDC (ActiveDirectory) 设置是默认设置。票证有效期 = 10 小时,续订请求阈值 = 7 天。

源代码

import java.util.HashMap;
import java.util.Map;
import javax.security.auth.Subject;
import com.sun.security.auth.module.Krb5LoginModule;

public class Temp3 {
    public static void main(String[] args) throws Exception {
        System.setProperty("sun.security.krb5.debug", "true");

        Subject subject = new Subject();

        Krb5LoginModule krb5 = new Krb5LoginModule();

        Map <String, String> map = new HashMap <String, String>();
        map.put("useTicketCache", "true");
        map.put("doNotPrompt", "true");
        map.put("renewTGT", "true");
        map.put("debug", "true");

        krb5.initialize(subject, null, null, map);
        krb5.login();
        krb5.commit();
        System.out.println(subject);
    }
}

当票证未过期时,代码工作正常,即我在运行上述代码后 10 小时内运行 kinit 的时间。

我编写此 POC 是因为我必须使用 SQL Server 驱动程序(4.0 版)运行基于 JDBC 的应用程序。我不希望长时间运行的服务在数据库重新连接尝试期间失败,这可能是由于网络故障等因素导致管道损坏。

【问题讨论】:

  • 我们通过 JDBC 驱动程序使用 SQL Server 提供基于 Java 的服务(阅读 TIBCO BusinessWorks)。数据库团队不允许 sql server 身份验证。我们不能使用集成身份验证,因为 java 代码将在 AIX 机器上运行。选项是使用 kerberos。鉴于这些是长期运行的服务,我想确保在启动连接时(即尝试登录时)更新票证缓存。所以要求是(1)最初使用 kinit 并获得票证缓存(2)具有更新过期缓存的机制

标签: java kerberos


【解决方案1】:

你走错路了。首先,您应该使用LoginContext 来获取凭据,而不是直接与 Kerberos 5 交互。其次,非人工访问需要一个 keytab。这相当于 TGT。为您的服务器导出 Keytab 并修改 Krb5LoginModule 配置。 This 教程会帮助你。

【讨论】:

  • 感谢您的链接。正如前面的问题陈述中提到的,我们将使用 JDBC 连接到 SQL Server,我所拥有的只是 JDBC URL 'jdbc:sqlserver://:;databaseName=;integratedSecurity=true ;authenticationScheme=JavaKerberos'。我将无法为此连接提供 LoginContext,因为 SQL 服务器 JDBC 驱动程序将调用 Krb5LoginModule。我将只提供 JAAS 配置文件,其中包含 useTicketCache、renreTGT 等设置。
  • 如果您提供 JAAS 配置文件,您可以将 KeytabLocation 放在那里。
  • 这是我的 JAAS 登录配置内容:client { com.sun.security.auth.module.Krb5LoginModule required debug=true useTicketCache=true doNotPrompt=true renewTGT=true; };我没有使用 keyTab。 keyTab 如何解决我的问题 - 你能解释一下吗?谢谢。
  • 好的,现在我明白了。您是否在系统帐户下运行?初始 TGT 是如何获得的?当您以SYSTEM 运行时,与普通用户相比,票证不同。
  • 我使用 POC 的普通域帐户运行它。初始 TGT 是通过发出 java kinit 获得的。抱歉延迟回复,我不想在办公室。感谢您一直以来对 Michael-O 的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多