允许在没有 Active Directory 信任的情况下进行 winhttp 委派

Allow winhttp delegation without Active Directory trust

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

我已经使用 kerberos MIT 版本的 GSoap 和 GSS-API 做到了;但我希望使用 winHTTP 来处理身份验证。

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

当我查看 GSS-API kerberos 票证时,我发现了几个允许委托的标志,例如 fowardable 或 deleg_req_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 或所有看起来像委托的选项,但在使用此选项时我遇到了一个奇怪的错误:

End of file or no input: message transfer interrupted or timed out (629s recv send delay)

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

.

我研究过你提供的这种 problem a lot. You are experiencing the Kerberos double-hop problem. In that 配置截图,你必须配置委托;现在委托还没有设置。要尝试的第一项是开放委派,为此 select 单选按钮:信任此计算机以委派任何服务(仅限 Kerberos)。您在需要使用客户端凭据连接 SQL 服务器的 AD 计算机帐户上设置此项 - 而不是在域控制器帐户上。如果您的应用程序实际上 运行 在域控制器上,那么这是一个已知问题和不受支持的配置,将无法正常工作 - 请将应用程序移动到域的成员服务器。

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

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

在该帐户的 Kerberos 委派属性中,您可以指定开放委派(如上所述顶部单选按钮),或指定对 Server2 上的进程的约束委派,Server1 可以将用户凭据转发到该进程(Kerberos 服务门票)。