【问题标题】:Using SSPI, how should one send a Kerberos token to a GSSAPI enabled HTTP proxy server?使用 SSPI,应该如何将 Kerberos 令牌发送到启用 GSSAPI 的 HTTP 代理服务器?
【发布时间】:2014-07-18 06:40:53
【问题描述】:

我有一个简单的客户端套接字应用程序,我想通过它访问网站。为了访问 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”字段(如上所述)。虽然计算 SECBUFFER_TOKEN 缓冲区中包含的内容的 base64 编码是我最初的猜测,但服务器不接受结果,因此它显然是无效的。

进一步的研究表明,令牌必须“包装”(通过 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

【问题讨论】:

    标签: kerberos sspi gssapi


    【解决方案1】:

    您真的想自己编写代理交互代码吗?我宁愿推荐在 Windows 上使用libcurl。这与 TMG 在工作中的效果很好。

    您的复制和粘贴失败的原因是接受检测到您重新发送作为回复。 Kerberos 是防重放的。你不能偷一张票并重复使用它。

    假设您调用了InitializeSecurityContext,并在成功调用SEC_E_OK 时收到指向SecBufferDesc 的指针。您必须访问包含的数组,读取PSecBuffer 结构,访问pvBuffer 元素并将void* 转换为unsigned char* 传递给将unsigned char*(十六进制字节)转换为base64 到@987654330 的函数@。不要忘记传入cbBuffer 长度。那你不。这是您的 HTTP 代理的 base64 编码票证。

    您可以使用EncryptMessage,但不能使用 HTTP。 HTTP 使用 TLS。如果您想使用EncryptMessage,请使用普通套接字。 EncryptMessage 将透明地加密您的客户端和服务器之间的整个流量。

    顺便说一句:代理会向 IE 返回一张票,因为我总是询问相互身份验证。你应该做这个案子。因此,您必须查看初始化上下文,直到收到 OK 而不是 CONTINUE_NEEDED

    【讨论】:

    • 您好,感谢您提出替代方法。但是,我很想知道如何仅使用 Microsoft 的 SSPI 库来完成此操作。
    • 您将无法做到,因为您需要大量代码:1. SSPI 代码,2. 套接字通信,3. 与代理通信的 HTTP 实现等。您真的想要这样做?
    • 嗨,我已经在您概述的区域周围有大量代码。我会更新问题,澄清我的意图。
    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多