Kerberos票据验证失败需从TGT获取阶段逐层排查:1.检查预身份验证是否启用;2.验证客户端与KDC时间偏差是否超5分钟;3.确认密码状态及账户有效性;4.核对加密类型兼容性;5.抓包分析AS-REQ/AS-REP等关键包;6.排查SPN注册问题;7.处理大组成员导致的票据超限。

域环境下 Kerberos 票据验证失败,通常不是密码输错这么简单,而是预认证、时间同步、加密类型、SPN 或票据大小等环节出了问题。直接看错误现象往往容易误判,得从请求发起的第一步——TGT 获取阶段开始逐层验证。
检查预身份验证是否被拒绝
客户端向域控(KDC)请求 TGT 时若被拒,日志里常见 KDC_ERR_PREAUTH_REQUIRED 或事件 ID 4(KERB_ERR_PREAUTH_FAILED)。这不是密码错误,而是 KDC 拒绝了前置校验:
- 确认用户账户属性中“使用 Kerberos 预身份验证”已勾选(AD 用户和计算机 → 用户属性 → 帐户选项卡)
- 运行 w32tm /query /status 查看客户端与域控时间偏差,超过 5 分钟(Skew > 300000 ms)会触发 KDC_ERR_CLOCK_SKEW
- 检查密码状态:账户是否禁用、过期、强制重置未完成;可用 dsget user -samid username -pwdlastset -acctexpires -disabled 快速核对
- 确认客户端支持的加密类型(如 AES128/AES256)未被域策略禁用;查看注册表 HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters\SupportedEncryptionTypes 是否包含有效值
抓包定位票据流转断点
Kerberos 流量走 UDP 88 端口,Wireshark 中重点过滤 kerberos && udp.port==88,关注三类关键包:
- AS-REQ:客户端发给 KDC 的 TGT 请求,检查 padata 字段是否存在 PA-ENC-TIMESTAMP(预认证证据)
- AS-REP:KDC 返回的 TGT,若失败会带错误码(如 25=KDC_ERR_PREAUTH_REQUIRED,37=KDC_ERR_ETYPE_NOTSUPP)
- TGS-REQ/TGS-REP:后续服务票据请求,若返回 KRB_AP_ERR_MODIFIED,说明服务端密钥(如计算机账户密码)与票据加密密钥不匹配,常见于 NLB 或多网卡环境 DNS 解析异常
注意:若完全抓不到 88 端口流量,大概率已静默降级到 NTLM,需排查 DNS 解析、SPN 注册或防火墙拦截。
验证 SPN 和服务主体配置
访问具体服务(如 HTTP、MSSQL)失败时,常因 SPN 缺失或冲突:
- 用 setspn -L 帐户名 查看服务帐户注册的所有 SPN,确认目标服务(如 HTTP/web01.domain.com)存在且唯一
- 若 SPN 重复,用 setspn -D 删除错误绑定,再用 setspn -S 安全注册
- 对 IIS、SQL Server 等服务,确保其运行帐户(如 NetworkService、自定义服务帐户)具备“读取目录数据”权限,并正确注册 SPN
排查大组成员导致的票据超限
用户属于大量安全组(尤其通用组)时,PAC 数据膨胀,可能超出 MaxTokenSize 限制,表现为 HTTP 400(请求头过长)、GPO 不生效或登录缓慢:
- Windows Server 2012+ 默认 MaxTokenSize = 48000 字节,但若用户隶属 120+ 组,仍可能溢出
- 检查注册表 HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters\MaxTokenSize,必要时手动增大(如设为 65535)并重启机器
- 优化组结构:将通用组改为全局组或域本地组(SID 更短);清理冗余嵌套;禁用非必要声明策略

















