使用SSPI,如何将Kerberos令牌发送到启用GSSAPI的HTTP代理服务器?

时间:2014-07-18 06:40:53

标签: kerberos sspi gssapi

我有一个简单的客户端套接字应用程序,我想访问一个网站。为了访问Internet,我的客户端必须通过HTTP代理服务器(我正在使用Microsoft Forefront威胁管理网关)。代理服务器需要身份验证,并配置为通过GSSAPI接受Kerberos。

在我的客户端,我使用的是Microsoft的SSPI:

首先,我致电成员AcquireCredentialsHandle并返回SEC_E_OK

接下来,我调用InitializeSecurityContext也会成功并返回SEC_E_OK

到目前为止一切顺利。但现在,我需要将令牌提交给代理服务器进行授权,这是给我带来问题的部分。

如果我使用Internet Explorer连接到我的代理服务器,我可以通过Wireshark观看数据包交换。 IE与Kerberos协商票证,似乎通过Proxy-Authorization标头提交。标题内容似乎是base64编码。

如果我只是采用从InitializeSecurityContext返回的令牌,base64对其进行编码并通过Proxy-Authorization: Negotiate <base64Data>之类的标头将结果发送到代理服务器,则验证失败。

我觉得我很亲密,但仍然缺少一些东西。一个站点在发送之前在令牌上使用EncryptMessage进行了讨论。另一个讨论使用相互认证(我不认为IE使用相互认证,因为客户端似乎只发送一次授权,并且没有来自服务器的反馈数据(第二次调用InitializeSecurityContext)另一个站点概述了使用不同SEC_BUFFER类型(填充,数据等)和加密的令牌。我怀疑这是我需要做的,因为我没有找到关于如何做的很多文档。

您可能会有任何见解或建议。

更新2014年7月19日:为了清楚起见,我问如何使用SSPI来计算“base64Data”字段(如上所述)。虽然计算base64编码SECBUFFER_TOKEN缓冲区中包含的内容是我最初的猜测,但服务器不接受结果,因此显然无效。

进一步的研究表明,令牌必须“包装”(通过SSPI称为“EncryptMessage”)并以与GSSAPI兼容的方式加密,必须使用三个缓冲区(顺序为:SECBUFFER_TOKEN,SECBUFFER_DATA和SECBUFFER_PADDING)我昨天试了这个,但没有找到成功。

http://msdn.microsoft.com/en-us/library/ms995352.aspx

http://msdn.microsoft.com/en-us/magazine/cc301890.aspx

0 个答案:

没有答案