1.3.6.1.4.1.311.2.2.10 is NTLM which has a much smaller token size. Java does not support NTLM as a GSS-API mechanism.
I am not sure how this happens. Normally you need to configure the browser (For example, somewhere in about:config for Firefox) on which server you can use SPNEGO. Maybe you set up one and ignored the other? BTW, I assume you are using a single Windows KDC with 2 service principals HTTP/windows.server and HTTP/linux.server and different keytab used on those 2 servers. Is that correct? --Max > On Oct 11, 2017, at 8:26 PM, t...@quarendon.net wrote: > > I'm having trouble with getting spnego to work, and was hoping someone might > help. > I'm trying to perform a "Negotiate" authentication from a browser. My browser > is Chrome on Windows 10. > The endpoint I'm connecting to us a standard jetty server (it's wrapped up in > karaf), but I've implemented the actual Negotate handling manually. > > If I run the server on a Linux machine, using openjdk 1.8.141, it works, I > can successfully authenticate. > If I run the server on a Windows machine (same desktop machine as the browser > is running on), using oracle jdk 1.8.144, I can't get it to work. > > I have researched around, and it looks like there are some relevant JDK > issues in the past in this area (e.g, JDK-8078439, JDK-8048194), but I should > have the fixes to those. However my symptoms seem very similar to these bug > reports. However, since this seems very complicated to get exactly right, I > suspect I've either got something wrong in my java code, or there's some > issue in my machine Active Directory configuration. > > The sun.security.spnego.debug trace output in the case it doesn't work is > this: > > SpNegoContext.acceptSecContext: receiving token = a0 74 30 72 a0 30 30 2e 06 > 0a 2b 06 01 04 01 82 37 02 02 0a 06 09 2a 86 48 82 f7 12 01 02 02 06 09 2a 86 > 48 86 f7 12 01 02 02 06 0a 2b 06 01 04 01 82 37 02 02 1e a2 3e 04 3c 4e 54 4c > 4d 53 53 50 00 01 00 00 00 97 b2 08 e2 07 00 07 00 35 00 00 00 0d 00 0d 00 28 > 00 00 00 0a 00 d7 3a 00 00 00 0f 54 51 55 41 52 45 4e 44 4f 4e 2d 50 43 54 45 > 41 4d 57 50 43 > SpNegoToken NegTokenInit: reading Mechanism Oid = 1.3.6.1.4.1.311.2.2.10 > SpNegoToken NegTokenInit: reading Mechanism Oid = 1.2.840.48018.1.2.2 > SpNegoToken NegTokenInit: reading Mechanism Oid = 1.2.840.113554.1.2.2 > SpNegoToken NegTokenInit: reading Mechanism Oid = 1.3.6.1.4.1.311.2.2.30 > SpNegoToken NegTokenInit: reading Mech Token > SpNegoContext.acceptSecContext: received token of type = SPNEGO NegTokenInit > SpNegoContext: negotiated mechanism = 1.2.840.113554.1.2.2 > The underlying mechanism context has not been initialized > SpNegoContext.acceptSecContext: mechanism wanted = 1.2.840.113554.1.2.2 > SpNegoContext.acceptSecContext: negotiated result = ACCEPT_INCOMPLETE > SpNegoContext.acceptSecContext: sending token of type = SPNEGO NegTokenTarg > SpNegoContext.acceptSecContext: sending token = a1 14 30 12 a0 03 0a 01 01 a1 > 0b 06 09 2a 86 48 86 f7 12 01 02 02 > > I then get a second request comming in, and this fails quickly with > GSSAPI exception > GSSException: Defective token detected (Mechanism level: GSSHeader did not > find the right tag) > at sun.security.jgss.GSSHeader.<init>(Unknown Source) > at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) > at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) > > > When it does work, to a linux machine, I see this: > SpNegoContext.acceptSecContext: receiving token = <much longer token here> > SpNegoToken NegTokenInit: reading Mechanism Oid = 1.2.840.48018.1.2.2 > SpNegoToken NegTokenInit: reading Mechanism Oid = 1.2.840.113554.1.2.2 > SpNegoToken NegTokenInit: reading Mechanism Oid = 1.3.6.1.4.1.311.2.2.30 > SpNegoToken NegTokenInit: reading Mechanism Oid = 1.3.6.1.4.1.311.2.2.10 > SpNegoToken NegTokenInit: reading Mech Token > SpNegoContext.acceptSecContext: received token of type = SPNEGO NegTokenInit > SpNegoContext: negotiated mechanism = 1.2.840.113554.1.2.2 > SpNegoContext.acceptSecContext: negotiated mech adjusted to > 1.2.840.48018.1.2.2 > Entered Krb5Context.acceptSecContext with state=STATE_NEW > > > The obvious difference here is the order of the mechanism OIDs. My first > question is why this is different? It's the same browser performing both > requests. So does this difference indicate something different in the > kerberos service tickets the client machine has for the two services? I have > had difficulties getting this far, with there being some configuration > changes needed at the Active Directory level related to my Windows machine, > so maybe there's still some some configuration issue there? > > > Tracing through the java code in SpNegoContext.java, it's clear that the > condition: > if (mechList[0].equals(mech_wanted) || > (GSSUtil.isKerberosMech(mechList[0]) && > GSSUtil.isKerberosMech(mech_wanted))) { > > isn't true, hence GSS_acceptSecContext is never called, hence > isMechContextEstablished() when it is called generates the "The underlying > mechanism context has not been initialized" message. However I've no idea why > that's the case. > > Can someone give me more of an insight into why this isn't working for me? > Given the previous bugs in this area that have been fixed, I suspect that > this *can* work, which suggests to me that I've got some kind of > configuration problem that is why I'm getting this. > > Thanks.