使用 java 的 Kerberos 身份验证在外部网络上超时

Kerberos auth with java times out on external network

我按照这篇文章创建了一个 java 程序来测试 kerberos 身份验证:https://docs.oracle.com/javase/jndi/tutorial/ldap/security/gssapi.html

我唯一改变的是配置文件。

当我将我的 windows 客户端的 DNS 设置指向我的内部 windows DNS/Kerb 服务器时,该程序工作正常,但当我使用单独的 public 时它超时] DNS 服务器,即使: 1. 我的内部服务器打开了 tcp/udp 88 端口 2. 我的外部服务器有所需的 SRV 记录(端口 88 上的 _kerberos._tcp 和 _kerberos._udp) 3. 我能够使用我的 iPad 实现 kerberos 身份验证,使用和不使用用户证书,这是 而不是 使用我的 windows 服务器的 DNS

iPad 和我的其他客户都在使用同一个网络(我家的 wifi),我也尝试过从我的手机 phone 共享数据连接。

鉴于上面的#3 以及 java 程序在使用我的内部 DNS 的客户端上运行的事实,我有点困惑为什么我的 java 程序无法运行在这两种情况下(即使用内部或外部 DNS 服务器)。

你有什么建议吗?

来自 GitBook Hadoop 和 Kerberos:门外的疯狂 部分 Error Messages to Fear

Switching Kerberos to use TCP rather than UDP makes [some bizarre issues] go away ...
Note also UDP is a lot slower to time out ... Kerberos waits ~90 seconds before timing out, which is a long time to notice there's a problem ...

In /etc/krb5.conf

[libdefaults]
  udp_preference_limit = 1

PS:超时前的~90秒可特指Java-specific defaults

kdc_timeout = 30000
max_retries = 3


一般来说,UDP 似乎是许多奇怪的 Kerberos 问题的根本原因,请参见。 How to save Kerberos Service Ticket using a Windows Java client? 例如。
系统地禁用它可能是 "good practise".