Проверка наличия билетов Kerberos в кеше - PullRequest
2 голосов
/ 14 сентября 2011

Я написал некоторый код C для подключения к серверу Kerberized LDAP.Все это прекрасно работает, но в настоящее время он генерирует новый TGT при каждом подключении, а не использует его (если он уже существует) в кэше учетных данных по умолчанию.

Я рассмотрел использование лайковиз krb5_cc_resolve и krb5_initialize, чтобы получить ссылку на кеш, но это, кажется, разрушает кеш, если он уже существует, вместе с любыми билетами, которые он содержит.

По сути, я хочу знать: есть ли способпроверки кэша учетных данных по умолчанию для существующих TGT, не разрушая его?

Ответы [ 2 ]

1 голос
/ 13 января 2012

krb5_cc_initialize очищает кеш, как сказано в документации.Просто не делайте этого, если вы хотите получить доступ к существующему кешу

Из документов :

Любые существующие учетные данные отбрасываются и основное имя дляКэш установлен на значение, указанное

0 голосов
/ 19 ноября 2013

Посмотрите в коде kstart, где он реализует опцию -H.

http://git.eyrie.org/?p=kerberos/kstart.git;a=blob;f=framework.c;h=66e851413a9b4d71fa4d61ded2f3c0d71cd03b0c;hb=HEAD

Как правило, вам нужно проверить срок действия основной суммы в билете.

 /* Obtain the ticket. */
 memset(&increds, 0, sizeof(increds));
 code = krb5_cc_resolve(ctx, config->cache, &ccache);
 if (code != 0)
     goto done;
     increds.client = config->client;
 else {
     code = krb5_cc_get_principal(ctx, ccache, &increds.client);
    if (code != 0)
        goto done;
 }
 code = get_krbtgt_princ(ctx, increds.client, &increds.server);
if (code != 0)
     goto done;
 code = krb5_get_credentials(ctx, 0, ccache, &increds, &outcreds);
 if (code != 0)
    goto done;
 increds_valid = true;

 /* Check the expiration time and renewal limit. */
if (code == 0) {
    now = time(NULL);
   then = outcreds->times.endtime;
     if (config->happy_ticket > 0)
        offset = 60 * config->happy_ticket;
   else
        offset = 60 * config->keep_ticket + EXPIRE_FUDGE;
    if (then < now + offset)
       code = KRB5KRB_AP_ERR_TKT_EXPIRED;
...