使用 "java.security.krb5.conf" System.property() 更新 kerberors krb.conf 文件无效

Updating the kerberors krb.conf file using "java.security.krb5.conf" System.property() is not working

我想指向一个不同的krb.conf文件dynamically, without restarting the JVM。我在 Whosebug 上搜索了不同的解决方案,并尝试相应地实施该解决方案。但是有些方法,即使 如果我更新 System.property("java.security.krb5.conf", ...) 指向 the new krb.conf file,JAAS 无法理解这一点,并且仍在使用早期的 conf 文件。以下是我的代码解决方案的详细信息:

我的Jaas.conf文件如下:

   Mutual {
      com.sun.security.auth.module.Krb5LoginModule required client=TRUE;
   };
   sp.kerb.sso.KinitExample {
      com.sun.security.auth.module.Krb5LoginModule required 
      client=TRUE 
      refreshKrb5Config=true
      debug=true;
  };

出于显而易见的原因,我设置了 refreshKrb5Config=true,因为我想重新加载 krb 配置文件。

这是我要执行的代码: 包裹 sp.kerb.sso;

import sun.security.krb5.internal.tools.Kinit;

public class KinitExample {

public static void main(String[] args) {

      String kerberosFileName = "C:\Windows\krb5.ini";
      String jaas_config_file_name = "C:\Users\User1\temp\howrah.jaas.conf";

      System.setProperty("java.security.auth.login.config", jaas_config_file_name);  // setting the jaas config file
      System.setProperty("java.security.krb5.conf"        , kerberosFileName); // setting the kerberos file
      System.setProperty("java.security.krb5.debug"        , "true");

      final String administrator = "admin@exampledomain.lab".toUpperCase();
      String cacheFileLoc = "C:\Users\User1\temp\admin.cache";

      // Perfoming Kinit ...
      Kinit.main(new String[]{"-c",cacheFileLoc, administrator , "Password123" });

      kerberosFileName = "C:\Users\User2\temp\new.krb.conf";    // Using new KRB configuration file

      System.setProperty("java.security.krb5.debug"        , "true");
      System.setProperty("java.security.auth.login.config", jaas_config_file_name); // setting the property again
      
      System.setProperty("java.security.krb5.conf"        , kerberosFileName); // setting the property again

      System.out.println(System.getProperty("java.security.krb5.conf")); // Prints the updated conf file location.

      cacheFileLoc = "C:\Users\User2\temp\newadmin.cache";
      String newAdmin = "administrator@test.lab".toUpperCase();
      Kinit.main(new String[]{"-c",cacheFileLoc, newAdmin , "Password123" });
    }
 }

admin 的缓存已 创建,但 newAdmin 的缓存未 创建由于各自的 krb.conf 文件具有不同的领域,并且 JAAS 似乎无法从 new.krb.conf 连接到该领域,因此因臭名昭著而失败906 错误代码。

我做错了什么?我想要实现的是可能的吗?我该如何解决这个问题?


另请注意,如果我完全注释管理缓存创建逻辑并从新的开始。krb.conf(与 newAdmin 相关的所有代码)它工作得很好并为 newAdmin 创建缓存

您应该调用 sun.security.krb5.Config.refresh(); 以便从新文件重新加载配置。