kdc-options 中的 Canonicalize 在 Windows 中自动设置为 true

Canonicalize in kdc-options is automatically set to true in Windows

我最近用 JavaEE8 编写了一段代码,用于对用户进行身份验证,从应用程序服务器请求服务,在 Active Directory 域中使用 Kerberos。这包括一个使用密钥表文件根据目标域的 kdc 对服务器进行身份验证的过程。
使用当前系统时一切正常,但现在我必须使用 Windows 2008 服务器上的 运行 的 kdc 对服务器进行身份验证。
我在 java.lang.RuntimeException: javax.security.auth.login.LoginException: Message stream modified (41) 上挣扎了一段时间,终于找到了问题所在:
Windows 2008 机器上的 KDC 显然还不支持 RFC 6806 - 第 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 的规范化相关,但实际上没有任何改变规范化的 kdc-option,如 AS 中所示-请求。
因此,Windows 中似乎有一些设置专门覆盖了规范化 kdc 选项,使其始终为真。

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

这是我的 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 参数设置为 true 00010000)。
可悲的是,这并没有改变任何事情。也没有将带有 00010000 的参数添加到 Linux 版本。这让我想知道 krb5.conf 中的这些参数是否真的被使用了。
我知道描述域、领域、kdc 和加密类型的那些实际上是从该文件中使用的,但其余的似乎没有任何影响。

有没有人有过这种行为的经验?

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

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

sun.security.krb5.disableReferrals=true

这样,请求就没有规范化了。

在我的例子中,它通过降级 enctypes (java 11.0.11 + minikdc + win10)

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