gpt4 book ai didi

curl - 使用 SSPI 进行 Kerberos 身份验证

转载 作者:行者123 更新时间:2023-12-02 00:04:14 34 4
gpt4 key购买 nike

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

我想在 Windows 上使用 libcurl 通过 Kerberos/GSSAPI 身份验证访问网站。我首先尝试使用 MIT Kerberos 来解决它,但我还需要使用 SSPI 进行 NTLM 身份验证(libcurl 不支持同时使用两种不同的实现)。所以我希望使用 Windows SSPI 库在 Kerberos 中进行身份验证。我设法用 SSPI 和 SPNEGO 支持编译了 libcurl。

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

但每次我试图让它发挥作用时,我:

  • 不要从 SSPI 缓存中提供的凭据/领域的 DC 获取任何票证(我正在使用 kerbtray.exe 查看条目)。
  • 使用这些方法时,我应该在这个缓存中看到一张票吗?
  • 在使用 InitializeSecurityContext/AcceptSecurityContext 的客户端/服务器环回调用 ImpersonateSecurityContext 并查看 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 握手:
  • 联系 Web 服务器(web.b.com,其中 B.COM 是 Web 服务器的 kerberos 领域)
  • 收到未经授权的答复,WWW-Authenticate 参数设置为协商
  • Libcurl/SSPI 将 TGS-REQ 发送到当前用户域的域 Controller (DC)(假设为 A.COM)
  • 不知何故,下一个TGS-REQ被发送到Web服务器(B.COM)的域 Controller
  • 收到域 B.COM 的 Kerberos 票证,并在 LSA 缓存中添加了一个条目(可使用 klist.exe 或 kerbtray.exe 查看)
  • Libcurl 使用授权信息 (GSS-API) 向 Web 服务器发送 HTTP 请求

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

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

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

    最佳答案

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

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

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

  • 带有 KDC_ERR_WRONG_REALM 响应的 A.COM 域 Controller 上的 AS-REQ
  • B.COM 域 Controller 上的 AS-REQ,带有 KRB5KDC_ERR_PREAUTH_REQUIRED 响应
  • B.COM域 Controller 上的AS-REQ
  • B.COM域 Controller 上的TGS-REQ
  • 带有 GSS-API 身份验证信息的 HTTP 请求

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

    关于curl - 使用 SSPI 进行 Kerberos 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17535295/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com