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 的客户端/服务器环回并查看 Wireshark 中的数据包后使用 libcurl,我看到 libcurl 不使用任何提供的凭据并回退到 NTLM(这只会导致身份验证失败)
    • 环回客户端/服务器是正确的行为吗(我在网上找不到任何其他实现的例子)?
    • 假设模拟成功,libcurl 是否应该使用线程的模拟凭据?
    • libcurl 是否完全支持带有 SSPI 的 NTLM + Kerberos(我什至不确定......)?

为了方便调试和测试,你知道有什么工具可以在 SSPI 缓存中添加一个条目,比如 MIT Kerberos 库中的 kinit 吗?我正在使用 Windows Server 2003 资源工具包工具,但找不到任何此类工具...

任何帮助将不胜感激 !


编辑

好吧,我发现了如何使用 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参数设置为协商
  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 使用授权信息(GSS-API)向 Web 服务器发送 HTTP 请求

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

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

如何通过模拟用户user2.B.COM以使 libcurl 可以访问与该用户关联的票证以对 Web 服务器进行身份验证来完成这项工作?

4

1 回答 1

4

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

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

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

  1. 带有 KDC_ERR_WRONG_REALM 响应的 A.COM 域控制器上的 AS-REQ
  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 服务器执行任何我想要的请求。

于 2013-07-12T14:17:02.000 回答