Kerberos在Windows域中采用三阶段票据交换流程实现安全认证。第一阶段客户端向AS申请TGT,获取加密的会话密钥和TGT;第二阶段用TGT向TGS申请ST,获得服务会话密钥和服务票据;第三阶段凭ST向目标服务认证,完成单点登录。全程不传输明文密码,依赖krbtgt和服务账户密钥,时效性与时间同步、SPN配置等密切相关。
kerberos在windows域环境中的认证不是传统意义上的“三次握手”,而是三阶段票据交换流程,每阶段都包含请求与响应,核心目标是安全分发会话密钥、避免明文密码传输,并实现单点登录。整个过程依赖kdc(域控制器)、客户端和服务端三方协作,关键角色包括as(认证服务)、tgs(票据授权服务)和krbtgt账户。
第一阶段:客户端向AS申请TGT(身份凭证)
用户登录Windows域时,系统自动触发Kerberos初始认证。客户端构造KRB_AS_REQ请求,包含用户名(Principal)和用用户密码NTLM哈希加密的时间戳(Authenticator)。AS在AD中查到该用户后,执行两项操作:
- 生成一个临时会话密钥(Session Key-AS),用用户密码NTLM哈希加密后返回给客户端;
- 将同一Session Key-AS、时间戳、客户端信息等打包,用krbtgt账户的NTLM哈希加密,生成TGT(Ticket Granting Ticket),一并返回。
客户端用自己的密码哈希解密出Session Key-AS,但无法解密TGT——这保证了TGT不可篡改,也防止客户端伪造身份。
第二阶段:客户端向TGS申请ST(服务访问票据)
当用户访问域内服务(如文件服务器、SQL Server)时,客户端不再发送密码,而是携带TGT + 新的Authenticator(用Session Key-AS加密的时间戳)向TGS发起KRB_TGS_REQ请求。
- TGS先用krbtgt哈希解密TGT,提取出Session Key-AS和原始时间戳;
- 再用Session Key-AS解密客户端发来的Authenticator,比对两个时间戳是否一致、是否在5分钟有效窗口内;
- 验证通过后,TGS生成新的会话密钥(Session Key-Server),用Session Key-AS加密它,再用目标服务账户(如HOST/FILE01)的NTLM哈希加密服务票据(ST),包含Session Key-Server、时间戳、PAC(用户权限信息)等,合并返回。
此时客户端获得可访问特定服务的ST,但依然不知道服务端密钥——只有KDC和服务端掌握。
第三阶段:客户端向目标服务提交ST并完成认证
客户端构造应用层请求(如SMB连接),将ST和服务端可识别的Authenticator(用Session Key-Server加密)一并发送给目标服务器。
- 服务端用自己的NTLM哈希解密ST,获取Session Key-Server;
- 再用Session Key-Server解密Authenticator,校验时间戳防重放;
- 若校验通过,服务端确认客户端已获KDC授权,且未被篡改或重放,即建立可信会话。
整个过程中,用户密码从未在网络上传输,所有票据均有时效性(默认TGT 10小时、ST 8小时),且依赖AD中krbtgt和服务账户的长期密钥保障加密链安全。
运维中需关注的关键点
实际排错时,常见问题多集中在以下环节:
- 时间同步:客户端、服务端、域控之间时钟偏差超过5分钟,Authenticator直接被拒;
- SPN配置:服务主体名称缺失或重复,导致TGS无法匹配对应服务账户,报错KRB_AP_ERR_SKEW或KDC_ERR_S_PRINCIPAL_UNKNOWN;
- krbtgt密码轮换:若域中krbtgt账户密码被重置(如每年策略要求),旧TGT立即失效,用户需重新登录;
- 防火墙端口:确保TCP/UDP 88端口(Kerberos)在客户端与域控之间可达;
- 票据缓存状态:可用klist命令查看当前TGT/ST是否存在、是否过期,kinit可手动刷新TGT。










