我正在尝试使用 kerberos 使我的 springboot 应用程序工作。 我有一个在 docker 容器中运行的 apache kerby。
我已通过命令将 SPN 添加到我的 kerberos 数据库中,
<块引用>addprinc -randkey -pw 密码 HTTP/staging-example.com@EXAMPLE.COM
并通过命令创建了一个密钥表文件,
<块引用>xst -norandkey -k https.keytab HTTP/staging-example.com@EXAMPLE.COM
我可以通过 kinit 命令接收 tgt, kinit -kt https.keytab HTTP/staging-example.com@EXAMPLE.COM
当我执行 klist 时,我能够看到 tgt。
这确认我的 kdc 服务器运行良好。
我正在尝试通过 SPNEGO 将我的 kdc 与我的应用程序连接起来。 我提供了 krb5.conf 文件和 keytab 文件作为应用程序的 env 变量。
我的krb5.conf文件如下:
[libdefaults]
kdc_realm = EXAMPLE.COM
default_realm = EXAMPLE.COM
kdc_udp_port = 4000
kdc_tcp_port = 4000
pkinit_anchors = /etc/krb5/cacert.pem
ticket_lifetime = 3600
[realms]
EXAMPLE.COM = {
kdc = ip:port
}
[domain_realm]
.EXAMPLE.COM = EXAMPLE.COM
现在,当我尝试从浏览器(chrome 或 IE)访问应用程序时,会出现用户名密码的弹出窗口,但在输入用户名密码后不久,我的应用程序抛出错误:
<块引用>协商头无效:协商 TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKALpHAAAADw== org.springframework.security.authentication.BadCredentialsException: Kerberos 验证不成功
引起:org.ietf.jgss.GSSException:检测到有缺陷的令牌 (机制层面:GSSHeader 没有找到正确的标签)
根据我的理解,kerberos 验证失败,因此 正在使用 NTLM 令牌。
我认为我的应用程序无法访问 kdc 服务器。 如果我将 krb5.conf 文件导出为 KRB5_CONFIG 并 kinit 用户,则它可以正常工作。它工作正常。
PS:我已经让我的浏览器 kerberos 知道这篇文章: https://docs.cloudera.com/documentation/enterprise/5-12-x/topics/cdh_sg_browser_access_kerberos_protected_url.html
是否有任何浏览器设置或访问服务器所需的任何额外设置。
编辑:kdc 在 kubernetes 集群上运行。应用的 DNS 是谷歌云 DNS(A 记录)。