使用Microsoft IE中的Active Directory SSO到Java服务器时,为什么会出现GSS异常?

Tom*_*ire 2 java kerberos active-directory spnego gssapi

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

GSSException: Channel binding mismatch (Mechanism level: ChannelBinding not provided!)
Run Code Online (Sandbox Code Playgroud)

事实上,我认为IE在安装Windows补丁之前有效.

Tom*_*ire 5

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

通过扩展保护(另请参阅扩展保护认证),IE添加了一个绑定到SPNEGO协商的通道; 除了SSL会话标识符似乎是其中的一部分之外,我目前还不知道通道绑定所基于的数据.Java JGSS-API库尝试验证通道绑定,并且没有绑定所基于的数据.然后它抛出通道绑定不匹配异常.

该问题导致一些 互联网 流量,包括Sun Bug ID 6851973.

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

如果GSS_Accept_sec_context [RFC2743]的调用者作为通道绑定传递GSS_C_NO_CHANNEL_BINDINGS [RFC2744],则接受者可以忽略启动器提供的任何通道绑定,即使启动器确实传递了通道绑定,也会返回成功.

并且"所有主要的krb5实现者都实现了'MAY'".如果发起者正在呈现它,JGSS似乎要求接受者提供通道绑定.此外,该修复程序在Java 7,build 64中可用,并将重新移植到Java 5和6,尽管Java 6u18 似乎没有像6851973中报告的那样.

扩展保护身份验证中看到的解决方法是设置

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA\SuppressExtendedProtection
Run Code Online (Sandbox Code Playgroud)

注册表设置为0x02.这会禁用扩展保护.