【问题标题】:Using Kerberos S4U extensions (introduced in Java 8) to connect to database using JDBC使用 Kerberos S4U 扩展(Java 8 中引入)通过 JDBC 连接到数据库
【发布时间】:2015-03-31 20:12:01
【问题描述】:

我已经有一段时间没有用 Java 编码了,所以我可能遗漏了一些明显的东西。我想通过 JDBC 连接到数据库(我需要支持很多 - SQL Server、MySQL 等)。但是,我想使用在 Java 8 中添加的 Microsoft S4U Java 扩展支持来实现 Kerberos 委托。我不希望用户必须在我的中间层服务器上输入他们的凭据。我想使用 S4U 代表用户获取我的中间层服务器的票证,并使用它通过 doAs 函数(Subject.doAs 或 doAsPrivileged)调用 JDBC 代码。

我在 Windows 上使用 C++ 和 ODBC 添加了对协议转换和约束委派的支持。但我不知道如何对 Java 做同样的事情。 Java 上的 S4U 文档很少。此页面似乎包含最多的信息 - http://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/jgss-features.html。该页面显示“一个新的公共方法 (GSSCredential::impersonate) 已添加到 com.sun.security.jgss 包中以实现这些扩展。”基于http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/single-signon.html,我在想我需要使用类 LoginContext 和 Subject 在 JDBC 连接调用上调用 doAs,以便连接在 Subject 的凭据下通过。但是如何在混合中使用 GSSCredential::impersonate?

谢谢, 埃德

【问题讨论】:

    标签: java sql-server jdbc java-8 kerberos


    【解决方案1】:

    这是我在网上大量探索后得到的代码:

       GSSManager manager = GSSManager.getInstance();
       GSSCredential self  = manager.createCredential(GSSCredential.INITIATE_ONLY);
       GSSName user = manager.createName("myuser", GSSName.NT_USER_NAME);
       GSSCredential impCred = ((ExtendedGSSCredential)self).impersonate(user);
    
       Subject mySubject = new Subject();
       mySubject.getPrivateCredentials().add(impCred);
       PrivilegedAction action = new ClientAction();
       Subject.doAs(mySubject, action);
    

    我现在得到“GSSException:在 GSS-API 级别未指定失败(机制级别:尝试 在模拟调用中获取 S4U2self 凭据失败!)”,我仍在调查中。

    【讨论】:

    • 我终于能够使用上面的代码成功连接到数据库了。我必须从我的用户文件夹中删除 krbcc 缓存文件才能使异常消失。但是,当用户登录机器而不是我试图模拟的用户时,连接就会进行。所以,S4U2Self 的代码并没有真正的帮助。
    • 您是否确实为self 帐户启用了协议转换和约束委派?
    • 是的。当我使用 Win32 API 在 C++ 中编写代码并连接到同一台机器上的 SQL Server 数据库时,我能够为自己的帐户获得协议转换和约束委派。但是,Java 代码(使用 SQL Server JDBC 驱动程序)没有为同一用户执行 Kerberos 委派。我看到 S4U2SELF 运行良好,我能够以委托用户身份启动 PrivilegedAction,但 JDBC 代码不支持它,而只是作为默认主体连接到数据库。
    • 这可能是微软 JDBC 代码的一个缺陷。您是否尝试使用模拟上下文手动为服务器创建票证?
    • @user2237963 你在这方面有什么发现吗?我对需要在服务用户(冒充实际用户)上设置的标志感到困惑。
    猜你喜欢
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2021-03-15
    相关资源
    最近更新 更多