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
我最近用 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