Hi everyone,
I'm writing a simple Java program that stands up a KDC using the
SimpleKdcServer class, and I'm trying to use it for AS & TGS
operations. Relevant code is below:
kdc = new SimpleKdcServer();
kdc.setKdcHost("kdc.example.com");
kdc.setKdcPort(60088);
kdc.setKdcRealm("EXAMPLE.COM");
kdc.setAllowUdp(false);
kdc.setWorkDir(keytabFile.getParentFile());
kdc.init();
kdc.createPrincipal("[email protected]", "u1pwd");
kdc.createPrincipal("myservice/[email protected]",
"myservicepwd");
kdc.start();
I use kinit to fetch the TGT for my principal "u1" and that's
successful.
However, the subsequent TGS req from my client program fails with
the
error:
GSSAPI continuation error: Unknown code krcM 137
. I debugged through the source code for Kerby and saw that the full
exception was not getting thrown because of a (e instanceof
KdcRecoverableException) check. When I print the stacktrace via a
debugger, I see the following (apologies for the huge stack trace):
[pool-1-thread-1] INFO
org.apache.kerby.kerberos.kerb.server.request.KdcRequest - Found
fast padata and starting to process it.
org.apache.kerby.kerberos.kerb.KrbException: Decoding failed at
org.apache.kerby.kerberos.kerb.KrbCodec.decode(KrbCodec.java:85)
at org.apache.kerby.kerberos.kerb.KrbCodec.decode(KrbCodec.java:70)
at
org.apache.kerby.kerberos.kerb.server.request.KdcRequest.kdcFindFast
(
KdcRequest.java:213)
at
org.apache.kerby.kerberos.kerb.server.request.
KdcRequest.process(KdcRequest.java:170)
at
org.apache.kerby.kerberos.kerb.server.KdcHandler.
handleMessage(KdcHandler.java:116)
at
org.apache.kerby.kerberos.kerb.server.impl.DefaultKdcHandler.
handleMessage(DefaultKdcHandler.java:67)
at
org.apache.kerby.kerberos.kerb.server.impl.DefaultKdcHandler.run(
DefaultKdcHandler.java:52)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(
ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(
ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Unexpected item context [0]
[tag=0xA0, off=0, len=3+198], expecting 0x30 at
org.apache.kerby.asn1.type.Asn1Encodeable.decode(
Asn1Encodeable.java:219)
at org.apache.kerby.asn1.type.Asn1Encodeable.decode(
Asn1Encodeable.java:207)
at org.apache.kerby.kerberos.kerb.KrbCodec.decode(KrbCodec.java:83)
... 9 more
org.apache.kerby.kerberos.kerb.KrbException: Decoding failed at
org.apache.kerby.kerberos.kerb.KrbCodec.decode(KrbCodec.java:85)
at org.apache.kerby.kerberos.kerb.KrbCodec.decode(KrbCodec.java:70)
at
org.apache.kerby.kerberos.kerb.server.request.KdcRequest.kdcFindFast
(
KdcRequest.java:213)
at
org.apache.kerby.kerberos.kerb.server.request.
KdcRequest.process(KdcRequest.java:170)
at
org.apache.kerby.kerberos.kerb.server.KdcHandler.
handleMessage(KdcHandler.java:116)
at
org.apache.kerby.kerberos.kerb.server.impl.DefaultKdcHandler.
handleMessage(DefaultKdcHandler.java:67)
at
org.apache.kerby.kerberos.kerb.server.impl.DefaultKdcHandler.run(
DefaultKdcHandler.java:52)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(
ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(
ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Unexpected item context [0]
[tag=0xA0, off=0, len=3+198], expecting 0x30 at
org.apache.kerby.asn1.type.Asn1Encodeable.decode(
Asn1Encodeable.java:219)
at org.apache.kerby.asn1.type.Asn1Encodeable.decode(
Asn1Encodeable.java:207)
at org.apache.kerby.kerberos.kerb.KrbCodec.decode(KrbCodec.java:83)
... 9 more
The client program (and also kinit) were using the krb5.conf that
was auto-generated by the SimpleKdcServer in the workdir, and looked
like the following (I just replaced localhost with the FQDN of my
machine):
[libdefaults]
kdc_realm = EXAMPLE.COM
default_realm = EXAMPLE.COM
udp_preference_limit = 1
kdc_tcp_port = 60088
#_KDC_UDP_PORT_
[realms]
EXAMPLE.COM = {
kdc = kdc.example.com:60088
}
I had also enabled KRB5_TRACE on my client program that was making
the TGS req, and it shows the following:
[1588796] 1496515969.488037: ccselect can't find appropriate cache
for server principal myservice/kdc.example.com@ [1588796]
1496515969.488112: Getting credentials [email protected] ->
myservice/kdc.example.com@ using ccache FILE:/tmp/krb5cc_20474
[1588796] 1496515969.488170: Retrieving [email protected] ->
myservice/kdc.example.com@ from FILE:/tmp/krb5cc_20474 with result:
-1765328243/Matching credential not found (filename:
/tmp/krb5cc_20474) [1588796] 1496515969.488206: Retrying
[email protected] -> myservice/ [email protected] with
result: -1765328243/Matching credential not found (filename:
/tmp/krb5cc_20474) [1588796] 1496515969.488214: Server has referral
realm; starting with myservice/[email protected]
[1588796] 1496515969.488250: Retrieving [email protected] -> krbtgt/
[email protected] from FILE:/tmp/krb5cc_20474 with result:
0/Success [1588796] 1496515969.488259: Starting with TGT for client
realm:
[email protected] -> krbtgt/[email protected] [1588796]
1496515969.488266: Requesting tickets for myservice/
[email protected], referrals on [1588796]
1496515969.488298: Generated subkey for TGS request:
aes128-cts/476E
[1588796] 1496515969.488345: etypes requested in TGS request:
aes256-cts, aes128-cts, des3-cbc-sha1, rc4-hmac, camellia128-cts,
camellia256-cts [1588796] 1496515969.488460: Encoding request body
and padata into FAST request [1588796] 1496515969.488522: Sending
request (835 bytes) to EXAMPLE.COM [1588796] 1496515969.488553:
Resolving hostname kdc.example.com [1588796] 1496515969.488621:
Initiating TCP connection to stream
172.17.0.53:60088
[1588796] 1496515969.488682: Sending TCP request to stream
172.17.0.53:60088
[1588796] 1496515969.492213: Received answer (134 bytes) from stream
172.17.0.53:60088
[1588796] 1496515969.492222: Terminating TCP connection to stream
172.17.0.53:60088
[1588796] 1496515969.492292: Response was not from master KDC
[1588796] 1496515969.492309: TGS request result: -1765323383/Unknown
code krcM 137 [1588796] 1496515969.492332: Requesting tickets for
myservice/ [email protected], referrals off [1588796]
1496515969.492351: Generated subkey for TGS request:
aes128-cts/AECC
[1588796] 1496515969.492377: etypes requested in TGS request:
aes256-cts, aes128-cts, des3-cbc-sha1, rc4-hmac, camellia128-cts,
camellia256-cts [1588796] 1496515969.492430: Encoding request body
and padata into FAST request [1588796] 1496515969.492483: Sending
request (835 bytes) to EXAMPLE.COM [1588796] 1496515969.492493:
Resolving hostname kdc.example.com [1588796] 1496515969.492543:
Initiating TCP connection to stream
172.17.0.53:60088
[1588796] 1496515969.492586: Sending TCP request to stream
172.17.0.53:60088
[1588796] 1496515969.496886: Received answer (134 bytes) from stream
172.17.0.53:60088
[1588796] 1496515969.496894: Terminating TCP connection to stream
172.17.0.53:60088
[1588796] 1496515969.496948: Response was not from master KDC
[1588796] 1496515969.496963: TGS request result: -1765323383/Unknown
code krcM 137
I've tried the same scenario with the MIT krb5kdc service with the
same principals, and the TGS req is successful, with the trace log:
[1590761] 1496516355.23070: ccselect module realm chose cache
FILE:/tmp/krb5cc_20474 with client principal [email protected] for
server principal myservice/[email protected]
[1590761] 1496516355.23150: Getting credentials [email protected] ->
myservice/ [email protected] using ccache
FILE:/tmp/krb5cc_20474 [1590761] 1496516355.23212: Retrieving
[email protected] -> myservice/ [email protected] from
FILE:/tmp/krb5cc_20474 with result:
-1765328243/Matching credential not found (filename:
/tmp/krb5cc_20474) [1590761] 1496516355.23260: Retrieving
[email protected] -> krbtgt/ [email protected] from
FILE:/tmp/krb5cc_20474 with result: 0/Success [1590761]
1496516355.23269: Starting with
[email protected] -> krbtgt/[email protected] [1590761]
1496516355.23277: Requesting tickets for myservice/
[email protected], referrals on [1590761]
1496516355.23312: Generated subkey for TGS request:
aes256-cts/3F0A
[1590761] 1496516355.23368: etypes requested in TGS request:
aes256-cts, aes128-cts, des3-cbc-sha1, rc4-hmac, camellia128-cts,
camellia256-cts [1590761] 1496516355.23485: Encoding request body
and padata into FAST request [1590761] 1496516355.23552: Sending
request (933 bytes) to EXAMPLE.COM [1590761] 1496516355.23581:
Resolving hostname kdc.example.com [1590761] 1496516355.23651:
Sending initial UDP request to dgram
172.17.0.53:88
[1590761] 1496516355.24205: Received answer (912 bytes) from dgram
172.17.0.53:88
[1590761] 1496516355.24223: Response was not from master KDC
[1590761] 1496516355.24240: Decoding FAST response [1590761]
1496516355.24334: FAST reply key: aes256-cts/8818 [1590761]
1496516355.24376: TGS reply is for [email protected] -> myservice/
[email protected] with session key aes256-cts/126E
[1590761] 1496516355.24390: TGS request result: 0/Success [1590761]
1496516355.24395: Received creds for desired service myservice/
[email protected] [1590761] 1496516355.24401: Storing
[email protected] -> myservice/ [email protected] in
FILE:/tmp/krb5cc_20474 [1590761] 1496516355.24517: Retrieving
[email protected] -> krbtgt/ [email protected] from
FILE:/tmp/krb5cc_20474 with result: 0/Success [1590761]
1496516355.24528: Get cred via TGT krbtgt/ [email protected]
after requesting krbtgt/[email protected] (canonicalize off)
[1590761] 1496516355.24546: Generated subkey for TGS request:
aes256-cts/0D91
[1590761] 1496516355.24574: etypes requested in TGS request:
aes256-cts [1590761] 1496516355.24633: Encoding request body and
padata into FAST request [1590761] 1496516355.24689: Sending request
(931 bytes) to EXAMPLE.COM [1590761] 1496516355.24699: Resolving
hostname kdc.example.com [1590761] 1496516355.24750: Sending initial
UDP request to dgram
172.17.0.53:88
[1590761] 1496516355.25098: Received answer (900 bytes) from dgram
172.17.0.53:88
[1590761] 1496516355.25115: Response was not from master KDC
[1590761] 1496516355.25127: Decoding FAST response [1590761]
1496516355.25198: FAST reply key: aes256-cts/03AB [1590761]
1496516355.25234: TGS reply is for [email protected] -> krbtgt/
[email protected] with session key aes256-cts/A423 [1590761]
1496516355.25246: Got cred; 0/Success [1590761] 1496516355.25315:
Creating authenticator for [email protected] ->
myservice/[email protected], seqnum 751690771, subkey
aes256-cts/91D0, session key aes256-cts/126E
My best guess is that maybe I'm missing some configuration steps in
my Java code and that's causing the FAST request to fail. I couldn't
find any code examples for kerby anywhere which can help me with my
use case. Does anyone have any ideas about the above?
Apologies again for the long email, just wanted to share my trials
so far.
Have a nice weekend.
Cheers,
Pratyush