我最近使用 JavaEE8 编写了一段代码,用于在 Active Directory 域中使用 Kerberos 对用户进行身份验证、从应用程序服务器请求服务。这包括一个使用 keytab 文件根据目标域的 kdc 对服务器进行身份验证的过程。
使用当前系统时一切正常,但现在我必须使用在 Windows 2008 Server 上运行的 kdc 来验证服务器。
我与
java.lang.RuntimeException: javax.security.auth.login.LoginException: Message stream modified (41)
斗争了一段时间,终于找到了问题所在:canonicalize=true
。[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)。遗憾的是这并没有改变什么。 Linux 版本中也没有添加带有
00010000
我知道描述域、领域、kdc 和加密类型的内容实际上是从该文件中使用的,但其余部分似乎并没有真正产生任何影响。
经过多次调试,我通过设置系统属性解决了
sun.security.krb5.disableReferrals=true
这样,请求就没有被规范化。
default_tkt_enctypes = aes128-cts rc4-hmac
default_tgs_enctypes = aes128-cts
permitted_enctypes = aes128-cts
[libdefaults]
canonicalize = true
default_tkt_enctypes = rc4-hmac aes256-cts aes128-cts
default_tgs_enctypes = rc4-hmac aes256-cts aes128-cts
permitted_enctypes = rc4-hmac aes256-cts aes128-cts
allow_weak_crypto = true
ps。 Windows 服务器 2017 + java17 + jcifs 2.17