0

目前,我能够通过使用 JAAS 并获取从运行 Active Directory 的 Windows 服务器发送的票证授予票证来验证 Java 应用程序中的用户。这很容易用Krb5LoginModulein java 完成。

现在我想从我的 java 应用程序运行一个 ssh 命令并使用我的 TGT 来启用 ssh 不询问密码。我看过一些让 ssh 与 kerberos 一起工作的教程( OpenSSH 和 Kerberoskinit ),但它们用于获取他们的 TGT,并且票证存储在 /tmp/krbcc_XXX 中。然后在生成票证后,他们可以自由地 ssh。

我可以将 TGT 写入磁盘并将其存储在 /tmp/krbcc_XXX 中,或者我可以在 a 中运行 ssh 命令PrivilegedAction,但是我不知道是否可以工作。有没有公​​认的方法来做到这一点?

基本上,我想打电话给这样的东西,它不会要求我输入密码:

// Create Command.
List<String> arguments = new ArrayList<String>();
arguments.addAll(Arrays.asList("ssh", "user@host", "xterm"));

// Run SSH command.
ProcessBuilder process = new ProcessBuilder(arguments).start();
4

1 回答 1

1

您必须首先明确谁将发起 SSH 请求。Java 或底层 Linux/Unix 系统。如果你选择后者,这不是跨平台的,也不是 Java 的方式。您应该使用支持 Keberos 的 Java SSH impl。一切都应该顺利。JSch是一个带有gss-api-with-mic支持的纯 Java 实现。

另一方面,您可以尝试从使用Subject创建的私有凭据中获取私有凭据,LoginContext并将其写入默认的 CC 文件位置。完成后,尝试klist. 如果它读取 cc 文件,你就完成了。如果这不起作用,您可以检查 Sun 的CC 阅读器代码并将其反转。可能sun.security.krb5.internal.ccache.FileCredentialsCache是有趣的,还有它的更新和保存方法。任务是让私有主题凭证与所需的类兼容sun.security.krb5.internal.ccache.Credentials注意:此解决方案完全依赖于 Sun。我会选择第一种方法,或者你宁愿先跑kinit

于 2011-10-23T10:47:59.977 回答