允许没有Active Directory信任的winhttp委派

时间:2017-07-25 08:41:26

标签: c++ delegates kerberos delegation winhttp

我正在双跳场景中使用kerberos身份验证开发应用程序:客户端连接到需要使用客户端凭据连接SQL服务器的服务器。

我已经使用kerberos麻省理工学院发布的GSoap和GSS-API完成了它;但我本来希望使用 winHTTP 来处理身份验证。

然而,当我尝试将winHTTP与GSOAP WINHTTP PLUGIN( gsoapwinhttp on code.google )一起使用时,域控制器会阻止委派。我想保留此Active Directory配置:

Active Directory configuration picture

当我查看GSS-API kerberos票时,我发现了几个允许委托的标志,例如fowardable或deleg_req_flag:

Wireshark forwadable flag

所以我的问题是:我是否可以修改winHTTP标志,以便在不更改域控制器配置的情况下允许委派?

编辑:

我在setCredentials中使用选项WINHTTP_AUTH_SCHEME_NEGOTIATE,在setOption中使用WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW,以确保使用Microsoft网站WinHttpSetCredentials中指定的Kerberos或NTLM。

使用Fiddler我检查了HTTP连接并且它正在使用Kerberos,但我仍然无法委托给我的下一个服务器。

我尝试使用几乎所有可能的setOption选项,例如WINHTTP_ENABLE_SSL_REVERT_IMPERSONATION或者看起来像委托的所有选项但是在使用此选项时我有一个奇怪的错误:

  

文件结束或无输入:邮件传输中断或超时(629s recv send delay)

我尝试设置不同的recv_timeout但仍然是相同的错误。

1 个答案:

答案 0 :(得分:0)

我经常研究这种问题。您遇到了Kerberos双跳问题。在您提供的配置屏幕截图中,必须配置委派;现在代表团没有设定。要尝试的第一个项目是开放委派,要选择单选按钮:信任此计算机以委派任何服务(仅限Kerberos)。您在AD中的计算机帐户上设置此帐户,该帐户需要使用客户端的凭据连接SQL服务器 - 而不是在域控制器帐户上。如果您的应用程序实际上是在域控制器上运行,那么这是一个已知问题和不受支持的配置将无法正常工作 - 请将应用程序移动到域的成员服务器。

关于那些允许委托,例如fowardable或deleg_req_flag显示为在Fiddler跟踪中设置的标志,我不确定为什么它们显示为set,但它们可能是从错误的帐户设置的。从您发布的屏幕截图的帐户中,根本没有配置Kerberos委派。

在您的方案中,您必须在运行WinHTTP进程的计算机帐户上设置Kerberos委派,在下面显示的示例中为“Server1”。

Simple Kerberos delegation scenario

在该帐户的Kerberos委派属性中,您可以指定打开委派(如上所述的顶部单选按钮),或者对Server1可以转发用户凭据的服务器2上的进程进行约束委派(Kerberos服务票证)