Getting ticket from the KDC in C
Chris Hecker
checker at d6.com
Wed Jan 6 14:48:17 EST 2021
Have you compiled and run the samples in the source distribution (in
src/appl in my version)? There are two different client/server samples
and a user to user sample. Those should at least get you started
(they're how I got started with the krb5 c api). Also, the klist and
kvno sources show how to decode tickets and whatnot, if you need to do
that.
Chris
------ Original Message ------
From: "Dean Dln" <constantinedalianis at gmail.com>
To: krbdev at mit.edu
Sent: 2021-01-06 00:06:41
Subject: Getting ticket from the KDC in C
>Dear all,
>
>I would like to ask for some tips on how to get a ticket from the Key
>Distribution Center (KDC) using the MIT krb5 API in C/C++?
>
>I already have a working Java Client which uses GSS-API to obtain a ticket
>from the KDC (using a local TGT) and forwards it to a Java Server.
>
>The server accepts the security context using the following logic:
>
>private GSSContext acceptSecurityContext(Subject serverSubject, final
>byte[] kerberosServiceTicket) {
> return Subject.doAs(serverSubject, (PrivilegedAction<GSSContext>) () -> {
> GSSContext gssContext;
> try {
> gssContext = manager.createContext((GSSCredential) null);
> } catch (GSSException ex) {
> LOGGER.warn("Could not create Kerberos gssContext: " +
>ex.getMessage(), ex);
> return null;
> }
> try {
> gssContext.acceptSecContext(kerberosServiceTicket, 0,
>kerberosServiceTicket.length);
> } catch (GSSException ex) {
> LOGGER.warn("Could not accept security context: " +
>ex.getMessage(), ex);
> return null;
> }
> return gssContext;
> });
>}
>
>I am trying to implement a C client - similar to the Java one - using MIT
>krb5 API and I can't seem to make it work. So far this is my C client code:
>
> krb5_context context;
> krb5_ccache ccache;
> krb5_creds *outCreds = NULL;
> krb5_creds inCreds;
> int retval;
> char *principal = "...";
>
> retval = krb5_init_secure_context(&context);
> ...
>
> retval = krb5_cc_default(context, &ccache);
> ...
>
> memset(&inCreds, 0, sizeof(inCreds));
> retval = krb5_parse_name(context, principal, &inCreds.server);
> ...
>
> retval = krb5_cc_get_principal(context, ccache, &inCreds.client);
> ...
>
> retval = krb5_get_credentials(context, 0, ccache, &inCreds, &outCreds);
> ...
>
> // also tried using the following: krb5Ticket->enc_part.ciphertext.data
> // (maybe this is the correct way, but I should somehow decrypt it and
>use krb5Ticket->enc_part2 ?)
> // retval = krb5_decode_ticket(&outCreds->ticket, &krb5Ticket);
> // ...
>
> char *base64KerberosTicket = base64_encode(outCreds->ticket.data,
>strlen(outCreds->ticket.data));
>
> char *response = loginKerberos(base64KerberosTicket);
> ...
>
>Thank you in advance.
>
>Best regards,
>Dean
>_______________________________________________
>krbdev mailing list krbdev at mit.edu
>https://mailman.mit.edu/mailman/listinfo/krbdev
More information about the krbdev
mailing list