[JDK-8223172] Incomplete/Unusable Kerberos Cross-Realm Referrals Support
Weijun Wang
weijun.wang at oracle.com
Thu Oct 10 02:47:51 UTC 2019
Hi Michael,
Thanks for trying this new feature, you are always the first one.
If I remember correctly, when Martin developed this new feature, he was thinking of adding as little as possible spec change at the beginning. Therefore although there is a new KerberosPrincipal::KRB_NT_ENTERPRISE constant, it was just an integer and anyone can hardcode it. His next steps will be `kinit -e` and a new Krb5LoginModule option.
And welcome to provide more detail on your usecase.
--Max
> On Sep 26, 2019, at 5:27 AM, Osipov, Michael <michael.osipov at siemens.com> wrote:
>
> Hi folks,
>
> apologies upfront that I wasn't able when Martin Balao asked for a review of the code. I finally made to test it and cannot see that it is working anyhow here.
>
> I won't dive into my usecase now, but will depict two simple cases which are not possible.
>
> All tests were performed with Oracle JDK 13 on Windows 7:
>> java version "13" 2019-09-17
>> Java(TM) SE Runtime Environment (build 13+33)
>> Java HotSpot(TM) 64-Bit Server VM (build 13+33, mixed mode, sharing)
>
> 1. kinit (JDK bundled) does not work. It does neither provide an '-E' option, nor does it send NT-ENTERPRISE, but only NT-UNKNOWN:
>
>> 0000 30 25 a0 03 02 01 00 a1 1e 30 1c 1b 1a 6d 69 63 0%.......0...mic
>> 0010 68 61 65 6c 2e 6f 73 69 70 6f 76 40 73 69 65 6d hael.osipov at siem
>> 0020 65 6e 73 2e 63 6f 6d ens.com
>
> In byte 0x06 is the name type NT-UNKNOWN (0). In contrast to this with MIT Kerberos 1.17 and 'kinit -E' I see in Wireshark:
>
>> 0000 30 25 a0 03 02 01 0a a1 1e 30 1c 1b 1a 6d 69 63 0%.......0...mic
>> 0010 68 61 65 6c 2e 6f 73 69 70 6f 76 40 73 69 65 6d hael.osipov at siem
>> 0020 65 6e 73 2e 63 6f 6d ens.com
>
> byte 0x06 is now name type NT-ENTERPRISE-PRINCIPAL (10).
>
> Trying the very same with LSA on Windows with "run as user" I get for my implicit UPN osipovmi at AD001.SIEMENS.NET always type 10. It only uses NT-PRINCIPAL when I provide the local part (samAccountName).
>
> 2. Using the appropriate OID for the enterprise principal:
>
>> public static void main(String[] args) throws GSSException {
>> GSSManager m = GSSManager.getInstance();
>> Oid msUpnOid = new Oid("1.3.6.1.4.1.311.20.2.3");
>> Oid krb5PrincipalOid = new Oid("1.2.840.113554.1.2.2.1");
>> Oid krb5EnterprisePrincialOid = new Oid("1.2.840.113554.1.2.2.6");
>> Oid krb5MechOid = new Oid("1.2.840.113554.1.2.2");
>> GSSName upn = m.createName("michael.osipov at siemens.com", krb5EnterprisePrincialOid);
>> }
>
> gives me:
>> Exception in thread "main" GSSException: Name of unsupported type provided (Mechanism level: 1.2.840.113554.1.2.2.6 is an unsupported nametype)
>> at java.security.jgss/sun.security.jgss.krb5.Krb5NameElement.getInstance(Krb5NameElement.java:87)
>> at java.security.jgss/sun.security.jgss.krb5.Krb5MechFactory.getNameElement(Krb5MechFactory.java:99)
>> at java.security.jgss/sun.security.jgss.GSSManagerImpl.getNameElement(GSSManagerImpl.java:184)
>> at java.security.jgss/sun.security.jgss.GSSNameImpl.getElement(GSSNameImpl.java:478)
>> at java.security.jgss/sun.security.jgss.GSSNameImpl.init(GSSNameImpl.java:201)
>> at java.security.jgss/sun.security.jgss.GSSNameImpl.<init>(GSSNameImpl.java:170)
>> at java.security.jgss/sun.security.jgss.GSSNameImpl.<init>(GSSNameImpl.java:151)
>> at java.security.jgss/sun.security.jgss.GSSManagerImpl.createName(GSSManagerImpl.java:109)
>> at com.siemens.dynamowerk.Main.main(Main.java:20)
>
> and yes, the OID has never been defined in that class [1], but is present in MIT Kerberos [2].
>
> I haven't tried a programmatical kinit, but as mentioned in the notes [3], Krb5LoginModule does not support it, so I don't even have to try.
>
>
> Any insights?
>
> Beside that, it'd be very cool if this gets into 11u or better yet to 8u. I have talked with Weijun about this several times many years ago for Java 7+. I have no option to use anything else, but Java 8 for now.
>
> If someone wants to know better about my usecase, I'd be happy to lay it out in detail. I do need at least krb5EnterprisePrincialOid and better msUpnOid for my usecase.
>
> The only option I see now is to write a delegating wrapper for this:
>
>> GSSName upn = m.createName("michael.osipov at siemens.com", krb5PrincipalOid);
>> GSSName wrappedUpn = new WrappedGSSName(upn, krb5EnterprisePrincialOid);
>> System.out.println(wrappedUpn);
>> System.out.println(wrappedUpn.getStringNameType());
>
>> michael.osipov at siemens.com
>> 1.2.840.113554.1.2.2.6
>
> Michael
>
> [1] https://github.com/AdoptOpenJDK/openjdk-jdk13u/blob/bb0786d980437800b9d6efe17e42d18241714ea1/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5MechFactory.java#L51-L61
> [2] https://web.mit.edu/kerberos/krb5-devel/doc/appdev/gssapi.html
> [3] http://mail.openjdk.java.net/pipermail/security-dev/2018-December/018952.html
More information about the security-dev
mailing list