0

我在帮助客户为我们的软件配置 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 关于调试/响应:我没有直接访问客户域(活动目录)和网络服务器的权限。因此调试和回复您的答案可能需要几天时间。

4

1 回答 1

1

好的,问题是信任配置!如前所述,这是一种双向传递信任。遗憾的是,它既不是(子域除外)子域,也不是森林信任。这是一种外部信任。这样,kerberos 活动就没有名称路由约定。

我找到了这篇文章(https://jorgequestforknowledge.wordpress.com/2011/09/14/kerberos-authentication-over-an-external-trust-is-it-possible-part-6/),我们配置了名称路由手动通过 GPO。这成功了。

感谢 Bernhard 用他的问题为我指明了正确的方向。

于 2017-03-06T10:30:42.127 回答