注意:我设法取得一些进展,请参阅我当前问题的编辑,谢谢。
我想在Windows上使用libcurl来访问具有Kerberos / GSSAPI身份验证的网站。我首先尝试使用MIT Kerberos,但我还需要使用SSPI进行NTLM身份验证(libcurl不支持同时使用两种不同的实现)。所以我希望使用Windows SSPI库在Kerberos中进行身份验证。我设法用SSPI和SPNEGO支持编译libcurl。
现在我的问题是我需要使用提供的凭据连接到任何提供的域(它可能是当前用户的领域或不同的领域)。 根据我的理解,我需要从secur32.dll / security.dll调用AcquireCredentialsHandle和InitializeSecurityContext来检索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 握手:
然而,这是我的新问题,所有这些握手都是使用当前记录的凭据制作的,例如 user1@A.COM 。由于A.COM和B.COM之间存在信任,我的用户可以访问,因此可以使用。我更喜欢使用提供的凭据( user2.B.COM )来登录?
另外,我不太确定是否可以在与当前登录用户不同的用户的LSA缓存中添加条目?
如何通过模拟用户 user2.B.COM 以libcurl可以访问与此用户关联的故障单来对Web服务器进行身份验证的方式来完成此工作?
答案 0 :(得分:4)
也许这将有助于将来的某个人,所以这是我对上面列出的问题的解决方案。
我使用LogonUser和ImpersonateLoggedOnUser方法来模拟指定用户的线程。使用它,curl使用与线程的用户身份相关联的LSA缓存,并设法使用该身份访问Web服务器。
在我的设置中,我收到以下Kerberos数据包:
然后只要假冒有效,我就可以对B.COM上的Web服务器做任何我想要的任何请求。