spn 错误核心是“注册错”或“重复注册”,需抓包确认客户端请求的spn,用setspn -q查冲突,-d删除错误项、-s安全注册正确spn,并通过setspn -l和服务端抓包双重验证。
spn 错误导致服务异常,核心问题不是“没注册”,而是“注册错”或“重复注册”。kerberos 在第二跳(tgs 请求)时直接拒绝,现象是服务能启动、用户能登录(tgt 正常),但访问时卡住——http 401、sql 报错“目标主体名称不正确”、smb 拒绝访问、错误码 0x80090322 或日志中出现 kdc_err_principal_not_unique。
通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。
第一步:确认客户端实际请求的 SPN 是什么
别猜,要实锤。从出问题的客户端抓包(Wireshark),过滤:
kerberos && kerberos.sname == "HTTP/xxx" 或 kerberos.sname contains "MSSQLSvc"
看 sname 字段值,它就是 Kerberos 客户端正在查找的 SPN 字符串。这个值必须和 AD 中注册的一模一样(大小写、FQDN、端口、前缀都算)。
第二步:反向查谁注册了这个 SPN
在域控制器或有域管理员权限的机器上运行:
setspn -Q HTTP/intranet.contoso.com
输出多行(比如同时列出 CONTOSO\svc-old 和 CONTOSO\svc-new),说明冲突;
输出 “no such SPN found”,说明没注册,需补;
只输出一行且是目标账户,说明注册本身没问题,再查其他环节(如 DNS、账户状态、防火墙)。
第三步:安全清理与注册
先删错的,再用安全方式注册对的:
• 删除旧项:setspn -D HTTP/intranet.contoso.com CONTOSO\svc-old
• 补全注册(HTTP 类建议 FQDN + 短名):
setspn -S HTTP/intranet.contoso.com CONTOSO\svc-new
setspn -S HTTP/intranet CONTOSO\svc-new
• SQL Server 非默认端口必须带端口:setspn -S MSSQLSvc/sql01.contoso.com:15500 CONTOSO\sqlsvc
注意:必须用 -S,禁用 -A;命令执行账户要是服务运行账户本身,或域管理员。
第四步:验证是否真正生效
两件事缺一不可:
• 在服务所在服务器上运行:setspn -L CONTOSO\svc-new,确认列表里有刚注册的 SPN;
• 客户端再次抓包,观察对应 sname 的 TGS-REQ 是否收到 ST(票据)响应,而不是 error-code=25。
如果仍有 0x80090322,说明还有遗漏 SPN 没清理干净,回到第二步重新查。










