我在帮助客户为我们的软件配置 SSO(使用 Kerberos)时遇到了一个问题。
但首先,让我们给你一些背景:
正如您在附加的 krb5.ini 中看到的那样,我们想做跨域/领域 Kerberos,并且我们有四个不同的(Active Directory;都具有 2008 R2 森林/域功能级别)域。
1) test.local 2) subdomain.test.local (这显然是 test.local 的子域) 3) example.local 4) dummy.local
在 test.local 和 example.local 之间以及在 test.local 和 example.local 之间(手动)设置了双向传递信任。
并且(当然)test.local 和 subdomain.test.local 之间存在默认信任。
[libdefaults]
default_realm = TEST.LOCAL
default_tkt_enctypes = rc4-hmac aes128-cts aes256-cts des-cbc-crc des-cbc-md5
default_tgs_enctypes = rc4-hmac aes128-cts aes256-cts des-cbc-crc des-cbc-md5
permitted_enctypes = rc4-hmac aes128-cts aes256-cts des-cbc-crc des-cbc-md5
[realms]
TEST.LOCAL = {
kdc = dc001.TEST.local
kdc = dc002.TEST.local
}
EXAMPLE.LOCAL = {
kdc = dc001.example.local
kdc = dc002.example.local
}
SUBDOMAIN.TEST.LOCAL = {
kdc = dc001.SUBDOMAIN.TEST.local
kdc = dc002.SUBDOMAIN.TEST.local
}
DUMMY.LOCAL = {
kdc = dc001.dummy.local
kdc = dc002.dummy.local
}
[domain_realm]
test.local=TEST.LOCAL
.test.local=TEST.LOCAL
example.local=EXAMPLE.LOCAL
.example.local=EXAMPLE.LOCAL
dummy.local=DUMMY.LOCAL
.dummy.local=DUMMY.LOCAL
subdomain.test.local=SUBDOMAIN.TEST.LOCAL
.subdomain.test.local=SUBDOMAIN.TEST.LOCAL
跨域名解析工作得很好。
网络服务器是一个 linux 机器(如果我没记错的话,它是一个 RedHat 或 CentOS 安装)。fqdn 是 web001.test.local。
客户端(与它们所属的域不同)将 fqdn web001.test.local 视为本地 Intranet 区域的成员。
我们成功地为 web 服务器创建了一个服务用户和一个相应的 keytab 文件。
如果我们查询 test.local 并搜索 spn,我们会得到正确的响应:
<service user)>
HTTP/web001.test.local@TEST.LOCAL
HTTP/web001.test.local
HTTP/web001
之后我们开始测试并且 Kerberos 工作得很好(如果用户是 test.local 或 subdomain.test.local 的成员),直到我们尝试使用来自 dummy.local 和 example.local 的测试用户登录。
每次用户尝试从这些特定域登录时,我们都会得到以下堆栈跟踪:
09:44:25.447 WARN REQUEST[10.50.50.45]
o.s.s.k.w.a.SpnegoAuthenticationProcessingFilter - Negotiate Header was
invalid: Negotiate YIIJ...
org.springframework.security.authentication.BadCredentialsException:
Kerberos validation not successful
Caused by: java.security.PrivilegedActionException: null
Caused by: sun.security.krb5.KrbCryptoException: Checksum failed
Caused by: java.security.GeneralSecurityException: Checksum failed
正如我之前所说:Kerberos 与 test.local 和 subdomain.test.local 领域/域中的客户端/用户一起工作。
但我不明白为什么它不能与其他域/领域一起使用。
有人可以启发我或至少给我一个提示吗?
提前致谢。
PS 关于调试/响应:我没有直接访问客户域(活动目录)和网络服务器的权限。因此调试和回复您的答案可能需要几天时间。