代码之家  ›  专栏  ›  技术社区  ›  Tommy McGuire

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

  •  2
  • Tommy McGuire  · 技术社区  · 15 年前

    我正在为Java web应用程序构建一个Active Directory单点登录身份验证系统(使用SPNEGO/Kerberos),Firefox或(据说)Safari都可以正常工作,但Internet Explorer导致了一个例外:

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

    事实上,我认为IE在安装Windows修补程序之前就已经工作了。

    1 回复  |  直到 15 年前
        1
  •  5
  •   Tommy McGuire    15 年前

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

    Extended Protection (另见 Extended Protection for Authentication ),即向SPNEGO协商添加通道绑定;我目前不知道通道绑定基于什么数据,只是SSL会话标识符似乎是其中的一部分。Java JGSS-API库尝试在没有绑定所基于的数据的情况下验证通道绑定和canno。然后抛出通道绑定不匹配异常。

    这个问题导致了 some internet traffic 包括…在内 Sun Bug ID 6851973 .

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

    如果GSS_Accept_sec_上下文[RFC2743]的调用方传入 GSS_C_NO_CHANNEL_绑定[RFC2744]作为通道绑定,然后 接受方可以忽略发起方提供的任何通道绑定,

    “所有主要的krb5实现者都实现了这个‘五月’”。JGSS似乎要求接受方提供通道绑定(如果发起方提供)。此外,该修复程序在Java7、Build64中可用,并将向后移植到Java5和Java6,尽管Java6U18 似乎有6851973中报告的情况。

    如图所示的工作环境 就是设定

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA\SuppressExtendedProtection
    

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