ticket expired 错误本质是客户端TGT过期,与MongoDB配置、keytab或AD密码无关;需检查klist中End time是否早于当前时间,并确保客户端时间同步、krb5.conf正确配置、KRB5CCNAME环境变量有效。

ticket expired 错误本质是 TGT 过期,不是 MongoDB 配置问题
这个错误和 mongod 配置、keytab 文件、甚至 AD 用户密码都无关。Kerberos 协议强制要求客户端持有的票据授予票据(TGT)必须在有效期内,超时即失效。MongoDB 企业版只是被动使用系统级凭据缓存里的 TGT,它不参与续期逻辑。
典型现象是:连接前 klist 显示 ticket 存在但 Valid starting 时间已过;mongosh --gssapiServiceName mongodb -u "alice@EXAMPLE.COM" --authenticationDatabase '$external' 报 Authentication failed,而 mongod 日志里没有 GSSAPI 初始化失败,只有模糊的 SASL handshake error。
-
klist输出中End time字段早于当前系统时间,就是确切证据 - 默认 TGT 有效期为 10 小时(AD 域策略可调),renewal ticket(RGT)是否启用、是否允许自动续期,完全由域控策略控制
- 运行
mongod的用户(如mongod)的凭据缓存必须由该用户自己kinit获取,不能靠 root 或其他用户代劳
systemd 启动 mongod 时如何避免 ticket expired
手动 kinit 一次只能撑几小时,无法满足服务长期运行需求。systemd 必须接管 TGT 获取与续期流程,否则每次重启或超时后服务就断连。
- 在
/etc/sysconfig/mongod中设置:KRB5CCNAME=FILE:/var/lib/mongodb/krb5cc_mongod - 在 systemd unit 文件(如
/usr/lib/systemd/system/mongod.service)的[Service]段添加:Environment=KRB5CCNAME=FILE:/var/lib/mongodb/krb5cc_mongodExecStartPre=/usr/bin/kinit -k -t /etc/mongodb.keytab mongodb/m1.example.com@EXAMPLE.COM - 确保
/var/lib/mongodb/目录属主为mongod,且krb5cc_mongod缓存文件权限为600 - 不要依赖
kinit -R(renew)—— 多数 AD 环境禁用 RGT 续期,必须重新kinit -k
客户端连接时 ticket expired 的常见诱因
服务端 ticket 没过期,但客户端发起连接时提示 expired,问题一定出在客户端环境,而非 MongoDB 本身。
- 客户端主机时间偏差 >5 分钟:
chronyd或ntpd必须运行,且与域控时间源同步 - 客户端
krb5.conf中realms段未正确定义目标域 KDC 地址,导致 TGT 请求发错地方,拿到的是无效或过期票据 - 应用代码(如 PyMongo)启动时未继承
KRB5CCNAME,或显式设置了错误路径,导致驱动读取空/过期缓存 - 使用
mongosh时加了--username但没指定--authenticationDatabase '$external',触发了错误的认证流程,掩盖了真实票据状态
验证与快速定位 ticket 状态的三步法
别猜,直接查缓存、查日志、查 DNS。Kerberos 是“链式信任”,任何一环断裂都会表现为 ticket expired。
- 在
mongod运行用户下执行:klist -c FILE:/var/lib/mongodb/krb5cc_mongod,确认缓存路径、主体名、起止时间 - 检查 mongod 日志是否有
GSSAPI: Acquired server credentials for mongodb/m1.example.com@EXAMPLE.COM—— 有则说明服务端票据加载成功 - 用
nslookup m1.example.com和nslookup -x <IP>双向验证 FQDN 解析,SPN 中的主机名必须能被 KDC 正确反向解析,否则票据签发阶段就失败,后续所有“过期”提示都是假象
真正棘手的不是 ticket 过期本身,而是当它和 DNS 解析失败、时间不同步、KRB5CCNAME 环境变量丢失同时发生时,日志只报一个模糊的 expired,排查顺序错了就会在错误的方向上浪费数小时。

















