我正在做 kerberos 委派。我注意到它GSSUtil.createSubject(context.getSrcName(), clientCred)返回一个没有凭据的主题。在此之前,我已经完成GSSCredential clientCred = context.getDelegCred();了返回凭据的操作。编辑:当我从同一域中的一台机器访问我的服务时,它可以工作,而如果从同一域中的其他机器访问,它就不会。对 AD 需要哪些额外设置感到困惑?非常感谢任何帮助。以下是我的代码:public class KerberosTest { public Subject loginImpl(byte[] kerberosTicket, String propertiesFileName) throws Exception { System.setProperty("sun.security.krb5.debug", "true");// // no effect // System.setProperty("javax.security.auth.useSubjectCredsOnly","false"); final Krb5LoginModule krb5LoginModule = new Krb5LoginModule(); Subject serviceUserSubject = new Subject(); final Map<String,String> optionMap = new HashMap<String,String>(); HashMap<String, String> shared = new HashMap<>(); optionMap.put("keyTab", "C:\\kerberos_files\\sapuser.keytab"); optionMap.put("principal", "HTTP/SAPTEST@EQSECTEST.LOCAL"); // default realm// optionMap.put("principal", "kerberosuser"); // default realm optionMap.put("useFirstPass", "true"); optionMap.put("doNotPrompt", "true"); optionMap.put("refreshKrb5Config", "true"); optionMap.put("useTicketCache", "false"); optionMap.put("renewTGT", "false"); optionMap.put("useKeyTab", "true"); optionMap.put("storeKey", "true"); optionMap.put("isInitiator", "true"); optionMap.put("useSubjectCredsOnly", "false"); optionMap.put("debug", "true"); // switch on debug of the Java implementation krb5LoginModule.initialize(serviceUserSubject, null, shared, optionMap); // login using details mentioned inside keytab boolean loginOk = krb5LoginModule.login(); System.out.println("Login success: " + loginOk); // This API adds Kerberos Credentials to the the Subject's private credentials set boolean commitOk = krb5LoginModule.commit(); } }
1 回答
子衿沉夜
TA贡献1828条经验 获得超3个赞
我想出了一个重要的点,我没有在任何地方找到记录。-
在 AD 中配置 kerberos 服务用户时,“信任此用户进行委派(仅限 Kerberos)”将仅对保存此更改后创建的新 TGT 生效。
例如,如果用户在客户端计算机 A 上登录,比如上午 10:00。
管理员在上午 10:30 启用对 kerberos 服务用户的委派。
当用户从机器 A 上的浏览器点击应用程序 URL 时,委托将不起作用,因为他的 TGT 是在委托打开之前(上午 10:00)创建的。
如果用户从机器 A 注销并重新登录,将生成一个新的 TGT。委派现在非常适合该用户。
添加回答
举报
0/150
提交
取消