目前,我可以使用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();
答案 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
。