能否从TGS获取TGT票据?Kerberos服务身份模拟实现疑问
Kerberos代理认证问题:获取TGT用于后端服务请求
Kerberos认证流程

- Browser请求TGT ticket
- Browser请求TGS ticket(携带TGT作为请求参数)
- Browser请求WEB服务器并在HTTP头中发送TGS ticket
- Web服务器需要代表Browser端用户模拟请求Backend Servcice
第三步:WEB服务器端TGS认证代码
private val authService: AuthenticationService, private val ticketValidator: SunJaasKerberosTicketValidator, .... @Throws(AuthenticationException::class) override fun authenticate(authentication: Authentication): Authentication { val token = (authentication as KerberosServiceRequestToken).token val ticketValidation = ticketValidator.validateTicket(token) ... return KerberosServiceRequestToken( authenticatedUser, ticketValidation, authenticatedUser.authorities, token, ).apply { details = authentication.getDetails() } }
第四步:问题与当前代码
需求是将前序步骤获取的TGT ticket放入GSS API上下文并传递给后端服务,当前用于LDAP绑定的代码如下:
val ssoConnectionProperties = GSSAPIBindRequestProperties(null, null as String?) .apply { realm = ... kdcAddress = ... ticketCachePath = krbTgtPath keyTabPath = ... setUseKeyTab(true) setRequireCachedCredentials(true) setUseTicketCache(true) setEnableGSSAPIDebugging(true) } val bindRequest: BindRequest = GSSAPIBindRequest(ssoConnectionProperties) return LDAPConnection(connectionOptions, ssoKdcAddress, ldapConnectionProperties.port)
当前代码可运行,但不清楚如何从之前的步骤获取TGT ticket。
解决方案
- 从TicketValidation中提取凭证
第三步中ticketValidator.validateTicket(token)返回的ticketValidation对象,包含了Kerberos认证后的完整凭证信息,其中就包含用户的TGT。直接从该对象中提取GSS凭证即可:
// 从ticketValidation中获取用户的GSS凭证(包含TGT) val userGssCredential = ticketValidation.credentials
- 将凭证传入GSS API上下文
修改第四步的代码,直接使用提取到的用户凭证,无需依赖本地票据缓存文件:
// 传入从第三步获取的userGssCredential val ssoConnectionProperties = GSSAPIBindRequestProperties(null, null as String?) .apply { realm = ... kdcAddress = ... gssCredential = userGssCredential // 直接设置用户凭证 keyTabPath = ... setUseKeyTab(false) // 使用用户凭证时无需keytab setRequireCachedCredentials(false) setUseTicketCache(false) setEnableGSSAPIDebugging(true) } val bindRequest: BindRequest = GSSAPIBindRequest(ssoConnectionProperties) return LDAPConnection(connectionOptions, ssoKdcAddress, ldapConnectionProperties.port)
- 关键注意事项
- 不同Kerberos客户端库中,
ticketValidation的凭证属性命名可能略有差异,比如部分库中为gssCredentials,需根据实际库调整 - 需确保Kerberos KDC已配置Web服务的委派权限,允许其代表用户访问后端服务
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

