检查缓存中是否存在Kerberos票证

时间:2011-09-14 10:53:13

标签: c kerberos

我编写了一些C代码来连接Kerberized LDAP服务器。这一切都运行正常,但目前,它每次连接时都会生成一个新的TGT,而不是在默认凭据缓存中使用它(假设它已经存在)。

我已经研究过使用krb5_cc_resolve和krb5_initialize来获取对缓存的引用,但这似乎会破坏缓存(如果它已经存在)以及它所拥有的任何票证。

基本上,我想知道的是:有没有办法检查现有TGT的默认凭证缓存而不会破坏它?

2 个答案:

答案 0 :(得分:1)

正如文档所述,

krb5_cc_initialize清除了缓存。如果要访问现有缓存,请不要这样做

来自the docs

  

将丢弃任何现有凭据,并将缓存的主体名称设置为指定值

答案 1 :(得分:0)

在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;