【问题标题】:Canonicalize in kdc-options is automatically set to true in Windowskdc-options 中的 Canonicalize 在 Windows 中自动设置为 true
【发布时间】:2023-11-07 17:35:01
【问题描述】:

我最近用 JavaEE8 编写了一段代码,它在 Active Directory 域中使用 Kerberos 对用户进行身份验证、从应用服务器请求服务。这包括一个使用 keytab 文件根据目标域的 kdc 对服务器进行身份验证的过程。
使用当前系统时一切正常,但现在我必须使用在 Windows 2008 Server 上运行的 kdc 对服务器进行身份验证。
我在java.lang.RuntimeException: javax.security.auth.login.LoginException: Message stream modified (41) 上苦苦挣扎了一阵子,终于找到了问题所在:
Windows 2008 机器上的 KDC 显然还不支持 RFC 6806 - Section 11 FAST 方案(ENC-PA-REP 标志),因此客户端不得使用 kdc 选项 canonicalize=true
虽然 canonicalize 的默认值应该是 false(根据MIT Kerberos Documentation),但实际上当使用 Windows 机器作为客户端时,它一直设置为 true。
这可以通过使用 wireshark 跟踪网络流量并查看 req-body --> kdc-options --> canonicalize 下的 AS-REQ 来看到。
有趣的是,这发生在 Windows 中。当使用 Linux 作为客户端时,canonicalize 默认设置为 false,一切正常。

我尝试将所有我能找到的与规范化有关的设置添加到我的客户端使用的 krb5.conf 中,但实际上并没有改变 AS-REQ 中看到的规范化 kdc 选项。
因此,Windows 中似乎有一些设置专门覆盖了 canonicalize kdc-option 始终为真。

如果有人知道那可能是什么以及我如何改变这种行为,我将非常感激!

这是我的 krb5.conf libdefaults 部分当前的样子:

[libdefaults]
  default_realm = [our realm name]
  dns_lookup = false 
  dns_lookup_kdc = false  
  dns_lookup_realm = false
  default_tkt_enctypes = aes256-cts rc4-hmac
  default_tgs_enctypes = aes256-cts
  permitted_enctypes = aes256-cts
  canonicalize = false
  dns_canonicalize_hostname = false
  rdns = false


编辑: 我现在还尝试在 krb5.conf 文件中设置kdc_default_options = 0x00000000。这是在 Linux 上运行时默认设置的值,而在 Windows 上它始终设置为 00010000。 (区别在于 kdc-options 中的 canonicalize 参数使用00010000 设置为 true)。
可悲的是,这并没有改变任何事情。也没有将此参数与 00010000 添加到 Linux 版本。这让我想知道是否真的使用了 krb5.conf 中的这些参数。
我知道描述域、领域、kdc 和加密类型的那些实际上是从该文件中使用的,但其余的似乎并没有任何影响。

有没有人遇到过这种行为?

【问题讨论】:

    标签: windows active-directory kerberos java-ee-8


    【解决方案1】:

    我遇到了完全相同的问题。

    经过多次调试,我通过设置系统属性解决了

    sun.security.krb5.disableReferrals=true
    

    这样,请求没有被规范化。

    【讨论】:

    • 这确实有效,非常感谢!对于我来说,它甚至是一个完美的解决方案,因为它可以根据运行 KDC 的 Windows Server 的版本在每个应用程序服务器上进行设置。
    • 很高兴您发现它很有用。
    【解决方案2】:

    在我的情况下,它通过降级 enctypes (java 11.0.11 + minikdc + win10) 修复

    default_tkt_enctypes = aes128-cts rc4-hmac
    default_tgs_enctypes = aes128-cts
    permitted_enctypes = aes128-cts
    

    【讨论】:

    • 我很确定我在我们的环境中尝试过这种方法,但遗憾的是它对我不起作用。但是我无法重试此操作,因为幸运的是,到目前为止,我们的客户已将其 KDC 上的 Windows 版本从 2008R2 更新为问题不再存在的更新版本。
    最近更新 更多