kdc选项中的Canonicalize在Windows中自动设置为true



我最近用JavaEE8编写了一段代码,该代码在Active Directory域中使用Kerberos对用户进行身份验证,从应用程序服务器请求服务。这包括一个使用keytab文件根据目标域的kdc对服务器进行身份验证的过程
使用当前系统时一切正常,但现在我必须使用运行在Windows2008Server上的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
尽管规范化的默认值应该是false(根据MIT Kerberos文档(,但在使用windows机器作为客户端时,它实际上一直设置为true
这可以通过使用wireshark跟踪网络流量并查看REQ-body-->kdc options-->规范化下的AS-REQ来查看
有趣的是,这只发生在Windows中。当使用Linux作为客户端时,默认情况下规范化设置为false,一切正常

我试着将我能找到的所有引用规范化的设置添加到我的客户端使用的krb5.conf中,但实际上没有改变as-REQ中所示的规范化kdc选项
因此,在Windows中似乎有一些设置专门覆盖了规范化kdc选项,使其始终为true

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

以下是我的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选项中的规范化参数在00010000中设置为true(
很遗憾,这并没有改变任何事情。也没有将此参数与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

最新更新