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

问题描述 投票:0回答:2

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

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

Client{
keyTab=classpath: /mykeytab.keytab
}

Client{
keyTab=file: /mykeytab.keytab
}

Client{
keyTab=file: resources/mykeytab.keytab
}
java classpath kerberos jaas keytab
2个回答
4
投票

据我所知,除了 jaas.conf 文件中密钥表的绝对路径之外,无法使用任何其他内容。

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

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

并且

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

因此,基本方法中没有任何内容可以搜索类路径。另外,请参阅这里有关密钥表配置的问题

也就是说,并且没有在 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
对象已从用户的首选项中提取密钥表并对其进行验证。但是,我们可以实现类路径的搜索,而不是拥有特定的预浏览文件。


0
投票

在我的 Spring+Kafka+Kerberos 应用程序中,我能够在程序启动期间使用 System.setProperty("myname","myvalue") 设置属性,并使用 jaas.conf 文件中的属性,并且该值已展开( keyTab ="${myname}/conf/jaas.conf" )

© www.soinside.com 2019 - 2024. All rights reserved.