是否可以从 jaas.conf 中的类路径引用密钥表?

Is it possible to reference a keytab from the classpath in jaas.conf?

是否可以从 jaas.conf 中的类路径引用密钥表?

我已经尝试了以下方法,但似乎没有任何效果:

Client{
keyTab=classpath: /mykeytab.keytab
}

Client{
keyTab=file: /mykeytab.keytab
}

Client{
keyTab=file: resources/mykeytab.keytab
}

据我所知,除了 jaas.conf 文件中的 keytab 的绝对路径外,不可能使用任何东西。

Krb5LoginModule.java中,可以看到(来自,例如,Krb5LoginModule.java at github.com

if (useKeyTab) {
  ktab = (keyTabName == null)
           ? KeyTab.getInstance()
           : KeyTab.getInstance(new File(keyTabName));

并且 .getInstance() 代码将在实例化的 File 对象上使用 .getPath()(参见 KeyTab.java)。

因此,基本方法中没有任何内容可以搜索 class 路径。另请参阅 this question here about keytab configuration as well

也就是说,OP 的配置文件中没有显示,可以将 class 从通常的 "com.sun.security.authmodule.Krb5LoginModule" 更改为自定义模块。在此自定义模块中,然后可以执行一些操作,例如在 Map<String,?> 参数中设置条目,该参数在 Krb5LoginModuleinitialize 方法中使用。

我们已经实施了这样一种方法,以允许在我们的客户端应用程序中定义各种设置,而不是试图让我们的用户在客户端上编辑 jaas.conf 文件。因此,我们使用一个自定义模块,该模块使用封装 Krb5LoginModule, but sets all of the desired options into theMap` 的组合方法。

类似于:

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

可以在 class 路径中搜索所需的文件名,然后将找到的文件传递给 Map。在上面的类示例中,options 对象已从用户的首选项中提取密钥表并对其进行验证。但是,与其拥有一个特定的预浏览文件,不如搜索 class 路径。