我有一个简单的客户端套接字应用程序,我想访问一个网站。为了访问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)我昨天试了这个,但没有找到成功。