MIT Kerberos无法在MSLSA缓存中找到TGT

时间:2012-01-12 11:52:08

标签: windows active-directory kerberos

我正在努力使用使用MIT Kerberos进行身份验证的Windows应用程序。

如果用户使用域用户帐户登录Windows,klist会显示他从AD获得预期的票证,包括以下内容:

#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比较陌生,并且从一位离开的同事那里继承了这段代码,所以我可能会遗漏一些重要的基本信息。

1 个答案:

答案 0 :(得分:3)

您可能无法访问LSA中的会话密钥。只有SSPI可以访问。你可以试试这个

  

原因2:在某些Windows平台上使用本机票证缓存时会引发此异常。 Microsoft添加了一项新功能,在该功能中,他们不再导出票证授予票证(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相同的问题。

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