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

curl – 使用SSPI进行Kerberos身份验证,第1张

概述注意:我设法取得一些进展,请参阅我当前问题的编辑,谢谢. 我想在Windows上使用libcurl来访问具有Kerberos / GSSAPI身份验证的网站.我首先尝试使用MIT Kerberos,但我还需要使用SSPI进行NTLM身份验证(libcurl不支持同时使用两种不同的实现).所以我希望使用Windows SSPI库在Kerberos中进行身份验证.我设法用SSPI和SPNEGO支持编译 注意:我设法取得一些进展,请参阅我当前问题的编辑,谢谢.

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

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

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

>不要从DC中获取sspI缓存中提供的凭据/域的任何票证(我使用kerbtray.exe查看条目).

>使用这些方法时,我应该在此缓存中看到票证吗?

>在使用InitializeSecurityContext / AcceptSecurityContext的客户端/服务器环回调用ImpersonateSecurityContext并查看Wireshark中的数据包后使用libcurl,我看到libcurl不使用任何提供的凭据而是回退到NTLM(这只会导致身份验证到失败)

>环回客户端/服务器是否正确行为(我在Web上找不到任何其他实现的示例)?
>假设模仿成功,libcurl应该使用线程的模拟凭据吗?
> libcurl是否支持所有使用sspI的NTLM Kerberos(我甚至不确定……)?

为了便于调试和测试,您是否知道任何向sspI缓存添加条目的工具,例如来自MIT Kerberos库的kinit?我正在使用windows Server 2003资源工具包工具,但我找不到任何此类工具…

任何帮助将不胜感激 !

编辑

好吧,我发现了如何使用libcurl制作我想要的东西.
最后我假设我必须事先与sspI做一些工作,但curl正确支持它.

当使用正确构建的curl版本与sspI和SPNEGO标志时,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参数设置为Negotiate
> libcurl / sspI将TGS-REQ发送到当前用户域的域控制器(DC)(比如A.COM)
>不知何故,下一个TGS-REQ被发送到Web服务器的域控制器(B.COM)
>收到域B.COM的Kerberos票证,并在LSA缓存中添加一个条目(可通过k@R_502_6818@.exe或kerbtray.exe查看)
> libcurl使用授权信息向Web服务器发送http请求(GSS-API)

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

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

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

解决方法 也许这将有助于未来的人,所以这是我对上面列出的问题的解决方案.

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

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

> A.COM的域控制器上的AS-REQ,带有KDC_ERR_WRONG_REALM响应
> B.COM的域控制器上的AS-REQ,带有KRB5KDC_ERR_PREAUTH_required响应
> B.COM域控制器上的AS-REQ
> B.COM域控制器上的TGS-REQ
>带有GSS-API身份验证信息的http请求

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

总结

以上是内存溢出为你收集整理的curl – 使用SSPI进行Kerberos身份验证全部内容,希望文章能够帮你解决curl – 使用SSPI进行Kerberos身份验证所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1049975.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存