基于SSPI的Kerberos身份验证

5

注意:我已经取得了一些进展,请参见我的当前问题的编辑,谢谢。


我想在Windows上使用libcurl访问具有Kerberos/GSSAPI身份验证的网站。我首先尝试使用MIT Kerberos解决它,但我还需要使用SSPI进行NTLM身份验证(libcurl不支持使用两个不同实现的身份验证)。因此,我正在寻找使用Windows SSPI库进行Kerberos身份验证的方法。我成功地编译了支持SSPI和SPNEGO的libcurl。

现在我的问题是,我需要使用提供的凭据连接到任何提供的领域(它可以是当前用户的领域或其他领域)。 从我所理解的来看,我需要调用secur32.dll/security.dll中的AcquireCredentialsHandle和InitializeSecurityContext来检索Kerberos票证。

但是每次我尝试使其工作时,我会遇到以下问题:

  1. 不会从SSPI缓存中提供的凭据/领域的DC中获取任何票证(我使用kerbtray.exe查看条目)。
    • 当使用这些方法时,我应该在此缓存中看到一个票证吗?
  2. 在使用ImpersonateSecurityContext与InitializeSecurityContext/AcceptSecurityContext的客户端/服务器回路之后使用libcurl,并查看Wireshark中的数据包时,我发现libcurl不使用任何提供的凭据并回退到NTLM(这只会导致身份验证失败)
    • 客户端/服务器回路是正确的行为吗(我在网上找不到其他实现的示例)?
    • 如果模拟成功,libcurl是否应该使用线程的模拟凭据?
    • libcurl是否支持SSPI的NTLM + Kerberos(我甚至不确定...)?

为了简化调试和测试,您是否知道任何工具可以向SSPI缓存添加条目,例如来自MIT Kerberos库的kinit?我正在使用Windows Server 2003 Resource Kit Tools,但我找不到这样的工具...

任何帮助都将不胜感激!


编辑

好的,我找到了如何使用libcurl做我想要的事情。 最后,我假设我必须事先处理一些SSPI工作,但是curl正确支持它。

当使用正确构建的带有SSPI和SPNEGO标志的curl版本时,curl将对Kerberos领域进行认证并将其存储在LSA缓存中。

当使用curl.exe进行测试时,您需要指定--negotiate参数以及用户名/密码。但是,当使用libcurl时,只需将CURLOPT_HTTPAUTH选项设置为包含CURLAUTH_GSSNEGOTIATE的任何内容(例如CURLAUTH_ANY)。在我的测试中,libcurl执行了预期的Kerberos握手

  1. 联系Web服务器(web.b.com,其中B.COM是Web服务器的Kerberos领域)
  2. 收到未经授权的答案,WWW-Authenticate参数设置为Negotiate
  3. Libcurl/SSPI向当前用户所在域(假设为A.COM)的域控制器(DC)发送TGS-REQ
  4. 不知何故,下一个TGS-REQ被发送到Web服务器(B.COM)的域控制器
  5. 收到B.COM域的Kerberos票据,并在LSA缓存中添加一个条目(可使用klist.exe或kerbtray.exe查看)
  6. Libcurl使用授权信息(GSS-API)向Web服务器发送HTTP请求

然而,这个“握手”是使用当前登录凭据完成的,比如说user1@A.COM。由于A.COM和B.COM之间有信任关系,并且我的用户具有访问权限,因此它可以正常工作。我更希望使用提供的凭据(user2.B.COM)进行登录?

另外,我不太确定是否可以添加与当前已登录用户不同的用户的LSA缓存条目?

如何通过模拟用户user2.B.COM的方式使libcurl能够访问与该用户相关联的票证以对Web服务器进行身份验证?

1个回答

4
也许这会在将来帮助某人,所以这是我解决上述问题的方法。我使用了LogonUserImpersonateLoggedOnUser方法来模拟指定用户的线程。利用这个,curl使用了与线程的用户身份相关联的LSA缓存,并成功使用该身份访问了Web服务器。
在我的设置中,我收到以下凯伯罗斯数据包:
1. 在A.COM的域控制器上进行AS-REQ,回应为KDC_ERR_WRONG_REALM。 2. 在B.COM的域控制器上进行AS-REQ,回应为KRB5KDC_ERR_PREAUTH_REQUIRED。 3. 在B.COM的域控制器上进行AS-REQ。 4. 在B.COM的域控制器上进行TGS-REQ。 5. 使用GSS-API认证信息的HTTP请求。
只要模拟有效,我就可以对B.COM上的Web服务器进行任何请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接