Kerberos broken after upgrading from Java6 to Java7

后端 未结 3 1768
轻奢々
轻奢々 2021-02-05 22:17

I have a working application using the spring-security kerberos extension, running on jboss, running java 6.

I\'m in the process of upgrading my jvm from java 6 to jav

相关标签:
3条回答
  • 2021-02-05 22:59

    Change the keyTabLocation object to a string.

    So private String keyTabLocaiton.
    
          @Override
            public void afterPropertiesSet() throws Exception {
                Assert.notNull(this.servicePrincipal, "servicePrincipal must be specified");
                Assert.notNull(this.keyTabLocation, "keyTab must be specified");
                // if (keyTabLocation instanceof ClassPathResource) {
                // LOG.warn("Your keytab is in the classpath. This file needs special protection and shouldn't be in the classpath. JAAS may also not be able to load this file from classpath.");
                // }
                LoginConfig loginConfig = new LoginConfig(this.keyTabLocation, this.servicePrincipal,
                        this.debug);
                Set<Principal> princ = new HashSet<Principal>(1);
                princ.add(new KerberosPrincipal(this.servicePrincipal));
                Subject sub = new Subject(false, princ, new HashSet<Object>(), new HashSet<Object>());
                LoginContext lc = new LoginContext("", sub, null, loginConfig);
                lc.login();
                this.serviceSubject = lc.getSubject();
            }
    

    Also where the LoginConfig guy, set the isInitiator flag to true.

     public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
                HashMap<String, String> options = new HashMap<String, String>();
                options.put("useKeyTab", "true");
                options.put("keyTab", this.keyTabLocation);
                options.put("principal", this.servicePrincipalName);
                options.put("storeKey", "true");
                options.put("doNotPrompt", "true");
                if (this.debug) {
                    options.put("debug", "true");
                }
                options.put("isInitiator", "true");
                //options.put("isInitiator", "false");
    
                return new AppConfigurationEntry[] { new AppConfigurationEntry("com.sun.security.auth.module.Krb5LoginModule",
                        AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options), };
            }
    

    Hopefully this helps you fix your issue.

    0 讨论(0)
  • 2021-02-05 23:02

    Yes! We patched SunJaasKerberosTicketValidator to look like this and it worked:

    String keyTabPath = this.keyTabLocation.getURL().toExternalForm();
    String runtimeVersion = System.getProperty("java.version");
    if (runtimeVersion.startsWith("1.7")) 
    {
          LOG.info("Detected jdk 7. Modifying keytabpath");
          if (keyTabPath != null)
          {
            if (keyTabPath.startsWith("file:")) 
            {
                keyTabPath = keyTabPath.substring(5);
            }
          }
    }
    LOG.info("KeyTabPath: " + keyTabPath);
    LoginConfig loginConfig = new LoginConfig(keyTabPath, this.servicePrincipal,
                    this.debug);
    
    0 讨论(0)
  • 2021-02-05 23:13

    Here are two potential issues that might be affecting you:

    1. Java 7 appears to switch the default encryption type order. Details:

      • Java 7 Kerberos Issue - AES128 Corrupt checksum

    2. You did't say what specific version of JDK 7 you are using, but there was a bug in earlier versions of JDK 7 that prevented loading keytab files via "file:" URLs:

      • http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=2221392

    Another user on SO worked around the last issue by modifying Spring source:

    • BadCredentialsException: Kerberos validation not succesfull
    0 讨论(0)
提交回复
热议问题