使用Java中获取的TGT进行SSH /其他应用程序

时间:2011-10-20 17:32:59

标签: java ssh single-sign-on kerberos gssapi

目前,我可以使用JAAS对Java应用程序中的用户进行身份验证,并获取从运行Active Directory的Windows服务器发送的票证授予票证。使用java中的Krb5LoginModule可以轻松完成此操作。

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

我可以将TGT写入磁盘并将其存储在/ tmp / krbcc_XXX中,或者我可以在PrivilegedAction中运行ssh命令,但我不知道是否有效。是否有可接受的方式来做到这一点?

基本上,我想打电话给这样的话,不要问我密码:

// 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();

1 个答案:

答案 0 :(得分:1)

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

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