首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于SSPI的Kerberos认证

基于SSPI的Kerberos认证
EN

Stack Overflow用户
提问于 2013-07-08 20:20:19
回答 1查看 9.3K关注 0票数 5

注意:我设法取得了一些进展,请看我当前问题的编辑,谢谢。

我想在Windows上使用libcurl访问具有Kerberos/GSSAPI身份验证的网站。我首先尝试用MIT Kerberos解决这个问题,但我也需要使用SSPI进行NTLM身份验证(libcurl不支持使用这两种不同的实现)。因此,我希望使用Windows库在Kerberos中进行身份验证。我用SSPI和SPNEGO支持编译了libcurl。

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

但每次我试着让它起作用,我:

  1. 不要从SSPI缓存中提供的凭据/域的DC获取任何票证(我正在使用kerbtray.exe查看条目)。
    • 使用这些方法时,我是否应该在这个缓存中看到一张票证?

  1. 在使用InitializeSecurityContext/AcceptSecurityContext的客户端/服务器回送调用ImpersonateSecurityContext并查看Wireshark中的数据包之后,我发现libcurl不使用任何提供的凭据并回退到NTLM (这只会导致身份验证失败) 。
    • 回送客户机/服务器是否是正确的行为(我在web上找不到任何其他实现的例子)?
    • 如果模拟成功,libcurl是否应该使用线程的模拟凭据?
    • libcurl是否支持NTLM + Kerberos和SSPI (我甚至不确定.)?

为了方便调试和测试,您知道有什么工具可以将条目添加到SSPI缓存中,例如来自MIT Kerberos库的kinit吗?我正在使用Windows 2003资源工具包工具,但是找不到任何这样的工具.

任何帮助都将不胜感激!

编辑

好吧,我找到了如何用libcurl做我想要的东西。最后,我假设我必须做一些工作与SSPI之前,但curl是正确的支持这一点。

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

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

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

然而,这是我的新问题,所有这些握手都是用当前记录的凭据进行的,比如user1@A.COM。由于A.COM和B.COM之间存在信任,而且我的用户可以访问,所以它可以工作。我宁愿使用提供的凭据(user2.B.COM)登录?

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

如何通过模拟用户user2.B.COM,使libcurl能够访问与此用户关联的票证以验证到web服务器,来实现此工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-12 14:17:02

也许这会对将来的人有所帮助,所以这里是我上面列出的问题的解决方案。

我使用LogonUserImpersonateLoggedOnUser方法来模拟具有指定用户的线程。使用它,curl使用与线程的用户标识相关联的LSA缓存,并设法使用该标识访问web服务器。

在我的设置中,我得到以下Kerberos数据包:

  1. 具有A.COM响应的KDC_ERR_WRONG_REALM域控制器的AS-REQ
  2. 具有B.COM响应的KRB5KDC_ERR_PREAUTH_REQUIRED域控制器的AS-REQ
  3. B.COM域控制器的AS-REQ
  4. B.COM域控制器的TGS-REQ
  5. 带有GSS-API身份验证信息的HTTP请求。

然后,只要模拟是有效的,我就可以在B.COM上对web服务器执行任何请求。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17535295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档