【发布时间】: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