java - 使用 Active Directory SSO 从 Microsoft IE 到 Java 服务器时,为什么会收到 GSSException?

标签 java active-directory kerberos gssapi spnego

我正在为 Java Web 应用程序构建 Active Directory 单点登录身份验证系统(使用 SPNEGO/Kerberos),并且在 Firefox 或(据报道)Safari 上一切正常,但 Internet Explorer 会导致异常:

GSSException: Channel binding mismatch (Mechanism level: ChannelBinding not provided!)

事实上,在安装 Windows 补丁之前,我认为 IE 可以正常工作。

最佳答案

显然,Microsoft IE 补丁 KB974455 为集成 Windows 身份验证启用了“扩展保护”。通常,通过 SPNEGO/Kerberos 身份验证,客户端计算机会获取服务器的 Kerberos/Active Directory 票证,并在 HTTP 身份验证协商期间提供此票证。至少从 Java 1.6 开始,Java JGSS-API 库能够解释 SPNEGO/Kerberos 协商并验证票证。

Extended Protection (另请参见 Extended Protection for Authentication ),IE 将 channel 绑定(bind)添加到 SPNEGO 协商;目前我不知道 channel 绑定(bind)基于什么数据,除了 SSL session 标识符似乎是其中的一部分。 Java JGSS-API 库尝试验证 channel 绑定(bind),但如果没有绑定(bind)所基于的数据,则无法验证 channel 绑定(bind)。然后抛出 channel 绑定(bind)不匹配异常。

该问题已导致 some internet traffic ,包括Sun Bug ID 6851973 .

根据与 6851973、RFC 4121 相关的评论,说,

If the caller to GSS_Accept_sec_context [RFC2743] passes in GSS_C_NO_CHANNEL_BINDINGS [RFC2744] as the channel bindings, then the acceptor MAY ignore any channel bindings supplied by the initiator, returning success even if the initiator did pass in channel bindings.
和“所有主要的 krb5 实现者都实现这个‘五月’”。如果发起者提供 channel 绑定(bind),JGSS 似乎要求接受者提供 channel 绑定(bind)。此外,该修复在 Java 7、build 64 中可用,并将向后移植到 Java 5 和 6,尽管 Java 6u18 似乎没有(如 6851973 中报告的那样)。

解决方法如Extended Protection for Authentication中所示是设置

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA\SuppressExtendedProtection

注册表设置为 0x02。这将禁用扩展保护。

关于java - 使用 Active Directory SSO 从 Microsoft IE 到 Java 服务器时,为什么会收到 GSSException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1785199/

相关文章:

java - 使用 Spring Kerberos 的 IE 中的 HTTP 400

java - 从 ResultSet 按行读取数据

java - 在java中显示一定数量的空格后的符号

java - Sonarqube 7.6 无法使用 Gradle 插件加载组件类 org.sonar.plugins.checkstyle.CheckstyleExecutor

powershell - foreach 循环的写入进度问题

c# - 如何知道我的 Windows 用户是域用户?

java - 如何在 Java 中禁用 kerberos 重播缓存?

java - 扩展 JFormattedTextField

Delphi & Active Directory 安全组

c++ - 如何解决 Kerberos 中的 "Encryption type not permitted"错误?