2012-01-12 69 views
2

我正在使用使用MIT Kerberos进行身份验证的Windows应用程序。MIT Kerberos无法在MSLSA缓存中找到TGT

如果一个用户登录到Windows域用户帐户,klist表明他会从广告预期的门票,包括这一个:

#1>  Client: jalf @ TESTREALM.COM 
     Server: krbtgt/TESTREALM.COM @ TESTREALM.COM 
     KerbTicket Encryption Type: RSADSI RC4-HMAC(NT) 
     Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent 
     Start Time: 1/12/2012 9:46:27 (local) 
     End Time: 1/12/2012 19:46:27 (local) 
     Renew Time: 1/19/2012 9:46:27 (local) 
     Session Key Type: RSADSI RC4-HMAC(NT) 

然而,当我们尝试用这张票我们的应用程序,Kerberos库似乎没有找到那个。

下面是相关的代码的简化版本:

// Open the MSLSA cache 
krb5_cc_resolve(kcontext, "MSLSA:", &mslsa_ccache); 
// Create a cursor for traversing the cache 
krb5_cc_start_seq_get(kcontext, mslsa_ccache, &cursor); 
// Check all the credentials in the cache 
while (!(code = krb5_cc_next_cred(kcontext, mslsa_ccache, &cursor, &creds))) { 
    // Find the one with the INITIAL flag set 
    if (creds.ticket_flags & TKT_FLG_INITIAL) { 
     // ticket found 
     krb5_free_cred_contents(kcontext, &creds); 
     break; 
    } 
    krb5_free_cred_contents(kcontext, &creds); 
} 

krb5_cc_end_seq_get(kcontext, mslsa_ccache, &cursor); 

但无论出于何种原因,我们不会进入// ticket found部分。 运行在调试器的代码,我可以看到它找到几张由klist所示的其他门票,但由于某种原因它永远不会找到一个我们感兴趣的问题。

任何人都可以解释这种现象,或如何解决它?天真地说,我期望klist的输出匹配krb5_cc_next_cred迭代缓存的结果。

我对Kerberos比较陌生,并且从离开的同事那里继承了这段代码,所以可能我错过了一些重要的基本信息。

回答

3

您可能无法访问LSA中的会话密钥。只有SSPI可以访问。在某些Windows平台使用本地票证缓存时,抛出此异常:你可以试试这个

原因2。微软已经添加了一项新功能,在该功能中,他们不再为票证授予票证(TGT)导出会话密钥。因此,在Windows上获得的本机TGT具有“空”会话密钥和空EType。受影响的平台包括:Windows Server 2003,Windows 2000 Server Service Pack 4(SP4)和Windows XP SP2。

解决方案2:您需要更新Windows注册表以禁用此新功能。应该添加注册表项allowtgtsessionkey并进行正确设置,以允许在Kerberos票证授予票证中发送会话密钥。

在Windows Server 2003和Windows 2000 SP4,这里是必需的注册表设置:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters 
Value Name: allowtgtsessionkey 
Value Type: REG_DWORD 
Value: 0x01 (default is 0) 

默认情况下,该值为0;将其设置为“0x01”允许将会话密钥包含在TGT中。 下面是在Windows XP SP2中的注册表设置的位置:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\ 
Value Name: allowtgtsessionkey 
Value Type: REG_DWORD 
Value: 0x01 

Java的GSS IMPL过这里失败。这是Oracle推荐的。您可能会遇到与MIT Kerberos相同的问题。

此更改仅在重新启动后才生效。

+0

+1,谢谢,非常有帮助。这似乎是问题。我需要在周一进行更多测试,如果一切顺利,我会接受答案。 :) – jalf 2012-01-13 16:03:16

+0

它与破解工作? – 2012-01-16 16:37:55

+0

似乎喜欢它。这仍然有点不稳定,但这似乎是一个不同的问题。当您登录到Windows帐户时,LSA缓存中有时看起来似乎较少或没有门票。 – jalf 2012-01-16 19:13:38

相关问题