新 KerberosToken 上格式错误的 PAC 登录信息

Malformed PAC logon info on new KerberosToken

我正在使用代码 here 从 Kerberos 令牌获取身份验证信息。在那里我配置了 domainUsername 和 domainUserPassword 并且只是 运行 它如 readme.md.

中指定

然后,我从 AD 域中的浏览器连接到 http://server:8080/spnego,我在打开的页面上看到了我的用户名@域。该页面还应包含我的用户所属的 AD 组的 SID。

查看服务器日志,我看到:

org.jaaslounge.decoding.DecodingException: Malformed PAC logon info.
    at org.jaaslounge.decoding.pac.PacLogonInfo.<init>(PacLogonInfo.java:209)
    at org.jaaslounge.decoding.pac.Pac.<init>(Pac.java:45)
    at org.jaaslounge.decoding.kerberos.KerberosPacAuthData.<init>(KerberosPacAuthData.java:13)
    at org.jaaslounge.decoding.kerberos.KerberosAuthData.parse(KerberosAuthData.java:21)
    at org.jaaslounge.decoding.kerberos.KerberosRelevantAuthData.<init>(KerberosRelevantAuthData.java:41)
    at org.jaaslounge.decoding.kerberos.KerberosAuthData.parse(KerberosAuthData.java:18)
    at org.jaaslounge.decoding.kerberos.KerberosEncData.<init>(KerberosEncData.java:136)
    at org.jaaslounge.decoding.kerberos.KerberosTicket.<init>(KerberosTicket.java:103)
    at org.jaaslounge.decoding.kerberos.KerberosApRequest.<init>(KerberosApRequest.java:62)
    at org.jaaslounge.decoding.kerberos.KerberosToken.<init>(KerberosToken.java:52)
    at com.example.ManualSpnegoNegotiateServlet.attemptNegotiation(ManualSpnegoNegotiateServlet.java:271)

第271行如下

KerberosToken token = new KerberosToken(kerberosTokenData, keys);

该错误消息太含糊了。我不知道如何继续,我从不同的客户那里得到同样的错误。

有人对此有什么建议吗?

这个是我自己想出来的。事实证明 "Malformed PAC logon info" 这个消息实际上是正确的。代码在尝试获取 "Resource groups data".

时失败

一开始我以为PAC_LOGON_INFO structure has changed since the last jaaslounge implementation was written (somewhere in 2010). I thought that because the MS-PAC specification根本就没有提到

实际上,问题出在一个完全不同的地方:KDC。它在 Win Server 2012 上是 运行,Microsoft 在其中默认添加的版本 resource SID Compression

你知道了,如果你在 KDC 上关闭资源 SID 压缩,一切都会开始工作(不需要触及任何其他东西,即 jaaslounge 的版本或使用无限制的 JCE 策略修补 hava)。