我正在努力使用使用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比较陌生,并且从一位离开的同事那里继承了这段代码,所以我可能会遗漏一些重要的基本信息。
答案 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相同的问题。
此更改仅在重新启动后生效。