[ https://issues.apache.org/jira/browse/HADOOP-16283?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16831001#comment-16831001 ]
Kihwal Lee commented on HADOOP-16283: ------------------------------------- Thanks for the analysis. It looks like branch-3.x and trunk are at kerby 1.0.1 and we will need to move to 1.1.2 when it is released. > Error in reading Kerberos principals from the Keytab file > --------------------------------------------------------- > > Key: HADOOP-16283 > URL: https://issues.apache.org/jira/browse/HADOOP-16283 > Project: Hadoop Common > Issue Type: Bug > Reporter: Farhan Khan > Priority: Major > > The error refers to the launching of Namenode daemon when Kerberos is used > for authentication. While reading Spnego principals (HTTP/.*) from the keytab > file to start the Jetty server, KerberosUtil throws an error: > {code:java} > javax.servlet.ServletException: java.io.IOException: Unexpected octets len: > 16716 > at > org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.init(KerberosAuthenticationHandler.java:188) > at > org.apache.hadoop.security.authentication.server.AuthenticationFilter.initializeAuthHandler(AuthenticationFilter.java:194) > at > org.apache.hadoop.security.authentication.server.AuthenticationFilter.init(AuthenticationFilter.java:180) > at > org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:139) > at > org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:873) > at > org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:349) > at > org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1406) > at > org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1368) > at > org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:778) > at > org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:262) > at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:522) > at > org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) > at > org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131) > at > org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:113) > at > org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) > at > org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) > at > org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131) > at org.eclipse.jetty.server.Server.start(Server.java:427) > at > org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105) > at > org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) > at org.eclipse.jetty.server.Server.doStart(Server.java:394) > at > org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) > at org.apache.hadoop.http.HttpServer2.start(HttpServer2.java:1140) > at > org.apache.hadoop.hdfs.server.namenode.NameNodeHttpServer.start(NameNodeHttpServer.java:177) > at > org.apache.hadoop.hdfs.server.namenode.NameNode.startHttpServer(NameNode.java:872) > at > org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:694) > at > org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:940) > at > org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:913) > at > org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1646) > at > org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1713) > Caused by: java.io.IOException: Unexpected octets len: 16716 > at > org.apache.kerby.kerberos.kerb.KrbInputStream.readCountedOctets(KrbInputStream.java:72) > at > org.apache.kerby.kerberos.kerb.KrbInputStream.readKey(KrbInputStream.java:48) > at > org.apache.kerby.kerberos.kerb.keytab.KeytabEntry.load(KeytabEntry.java:55) > at org.apache.kerby.kerberos.kerb.keytab.Keytab.readEntry(Keytab.java:203) > at > org.apache.kerby.kerberos.kerb.keytab.Keytab.readEntries(Keytab.java:189) > at org.apache.kerby.kerberos.kerb.keytab.Keytab.doLoad(Keytab.java:161) > at org.apache.kerby.kerberos.kerb.keytab.Keytab.load(Keytab.java:155) > at org.apache.kerby.kerberos.kerb.keytab.Keytab.load(Keytab.java:143) > at org.apache.kerby.kerberos.kerb.keytab.Keytab.loadKeytab(Keytab.java:55) > at > org.apache.hadoop.security.authentication.util.KerberosUtil.getPrincipalNames(KerberosUtil.java:225) > at > org.apache.hadoop.security.authentication.util.KerberosUtil.getPrincipalNames(KerberosUtil.java:244) > at > org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.init(KerberosAuthenticationHandler.java:152) > ... 29 more > {code} > The main problem is with reading of keytab file generated by heimdal-kdc > version 7.5.0. Keytab class of package org.apache.kerby.kerberos.kerb.keytab > deals with reading entries from keytab file. > This is the format of a keytab file. > {code:java} > keytab { > uint16_t file_format_version; # 0x502 > keytab_entry entries[*]; > }; > keytab_entry { > int32_t size; > uint16_t num_components; # subtract 1 if version 0x501 > counted_octet_string realm; > counted_octet_string components[num_components]; > uint32_t name_type; # not present if version 0x501 > uint32_t timestamp; > uint8_t vno8; > keyblock key; > uint32_t vno; #only present if >= 4 bytes left in entry > uint32_t flags; #only present if >= 4 bytes left in entry > }; > counted_octet_string { > uint16_t length; > uint8_t data[length]; > }; > keyblock { > uint16_t type; > counted_octet_string; > }; > {code} > First field of keytab_entry is the size of this entry in bytes. This field > itself is of four bytes. But, it contains the number of bytes of rest of the > fields. Keytab class tries to calculate number of bytes read in every entry. > The mistake is that it includes the (number of bytes of) first field in the > calculation of total number of bytes read for a single entry. This leads to > misinterpretation of successive entries in the keytab file. Hence, Unexpected > Octet len error is thrown. > I have raised an issue with apache/directory-kerby: > https://issues.apache.org/jira/browse/DIRKRB-734. > There is a PR also addressing this issue: > [https://github.com/apache/directory-kerby/pull/44] > -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: common-issues-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-issues-h...@hadoop.apache.org