是否可以从jaas.conf中的类路径引用密钥表?
我尝试了以下方法,但似乎无济于事:
Client{
keyTab=classpath: /mykeytab.keytab
}
Client{
keyTab=file: /mykeytab.keytab
}
Client{
keyTab=file: resources/mykeytab.keytab
}
答案 0 :(得分:3)
据我所知,除了jaas.conf文件中的keytab的绝对路径外,无法使用其他任何东西。
在Krb5LoginModule.java
中,人们看到了(例如,Krb5LoginModule.java at github.com)
if (useKeyTab) {
ktab = (keyTabName == null)
? KeyTab.getInstance()
: KeyTab.getInstance(new File(keyTabName));
.getInstance()
代码将在实例化的.getPath()
对象上使用File
(请参见KeyTab.java)。
因此,基本方法中没有什么可以搜索类路径。另外,请参见this question here about keytab configuration as well。
话虽如此,但未在OP的配置文件中显示,可以将类从通常的“ com.sun.security.authmodule.Krb5LoginModule”更改为自定义模块。然后,在此自定义模块中,您可以执行诸如在Map<String,?>
的{{1}}方法中使用的initialize
参数中设置条目等操作。
我们已经实现了这种方法,以允许在客户端应用程序中定义各种设置,而不是试图让我们的用户在客户端上编辑jaas.conf文件。因此,我们使用一个自定义模块,该模块使用组合方法封装了Krb5LoginModule
Map`。
类似于:
Krb5LoginModule, but sets all of the desired options into the
可以在类路径中搜索所需的文件名,然后将找到的文件传递到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
对象已从用户的首选项中拉出了keytab并对其进行了验证。但是,可以拥有一个对类路径的搜索,而不是拥有一个特定的预浏览文件。