是否可以从 jaas.conf 的类路径中引用密钥表?
我尝试了以下方法,但似乎没有任何效果:
Client{
keyTab=classpath: /mykeytab.keytab
}
Client{
keyTab=file: /mykeytab.keytab
}
Client{
keyTab=file: resources/mykeytab.keytab
}
据我所知,除了 jaas.conf 文件中的 keytab 的绝对路径之外,不能使用任何东西。
在 中Krb5LoginModule.java
,可以看到(例如,来自github.com 上的 Krb5LoginModule.java)
if (useKeyTab) {
ktab = (keyTabName == null)
? KeyTab.getInstance()
: KeyTab.getInstance(new File(keyTabName));
并且.getInstance()
代码将使用.getPath()
实例化File
对象上的 (参见KeyTab.java)。
因此,基本方法中没有任何内容会搜索类路径。另外,请参阅此处有关 keytab 配置的问题。
也就是说,并且没有显示在 OP 的配置文件中,可以将类从通常的“com.sun.security.authmodule.Krb5LoginModule”更改为自定义模块。在这个自定义模块中,可以做一些事情,例如Map<String,?>
在initialize
.Krb5LoginModule
我们已经实现了这样一种方法,以允许在我们的客户端应用程序中定义各种设置,而不是试图让我们的用户在客户端上编辑 jaas.conf 文件。因此,我们使用了一个自定义模块,该模块使用封装Krb5LoginModule, but sets all of the desired options into the
Map 的组合方法。
它是这样的:
Map<String, String> mOpts = new HashMap<>(); // options
mOpts.put("doNotPrompt", Boolean.TRUE.toString());
mOpts.put("useTicketCache", Boolean.FALSE.toString());
mOpts.put("useKeyTab", Boolean.TRUE.toString());
mOpts.put("keyTab", options.getKeytabPath().toString());
mOpts.put("principal", PrincipalUtils.getDefaultPrincipal().getName());
krb5LM.initialize(_subject, options.getCallbackHandler(), mSS, mOpts);
//
// attempt to authenticate the user
//
krb5LM.login();
可以在类路径中搜索所需的文件名,然后将找到的文件传递给Map
. 在上面的准示例中,options
对象已从用户的首选项中提取 keytab 并对其进行验证。但与其拥有一个特定的预浏览文件,不如实现对类路径的搜索。