参与角色
- Client
- Server
- KDC
- AD:存储所有Client的白名单,用于验证Client身份
- AS:为Client生成TGT 服务
- TGS:为Client生成某个服务的Ticket
名词解释
AS:身份认证服务,用于验证Client身份
KDC:密钥分发中心
TGT:票据中心,访问TGS的票据
TGS:票据授权服务
ST:访问Server的票据
SessionKey:临时会话密钥a,AS生成发送给客户端(随机密钥)
ServerSessionKey:临时会话密钥b,TGS生成发送给客户端(随机密钥)
具体流程
Client 向KDC-AS申请TGT
Client -> KDC-AS (AS_REQ)
发送AS_REQ:(被Client加密的时间戳, 客户端信息, 服务器端信息)
KDC-AS进行认证 看是否在白名单中
KDC-AS -> Client(AS_REP)
如果认证通过,AS会随机生成一个字符串 Sessionkey
发送两条消息
T(C) Client Pass Hash(SessionKey) ,用于后续与TGS服务通信
发送 SessionKey
TGT KDC Pass Hash(SessionKey, Client信息) ,作为向TGS申请票据的凭证
发送 SessionKey Client信息 结束时间
Client得到TGT后,向KDC请求访问server的权限。通过Client得到的TGT判断是否可以拥有访问Server的权限,如果可以就给Client访问Server权限的ticket
Client -> KDC-TGS (TGS_REQ)
客户端使用NTLM Hash解密T(C) 得到SessionKey
Client 向 TGS 发送消息
TGT
SessionKey(Client信息,时间戳) 可以记作认证因子,使用SessionKey进行加密
Client信息
Server信息
KDC-TGS -> Client(TGS_REP)
KDC使用NTLMHash解密 TGT 得到 (SessionKey,Client信息,结束时间)
然后使用SessionKey解密 认证因子 得到(Client信息,时间戳)
校验 时间戳与当前时间 和解密TGT后的Client信息与SessionKey解密后的Client信息
校验通过后,会判断客户端有没有权限访问服务端
认证通过后,KDC 会生成ServerSessionKey(随机生成)
发送RGS_REP:
SessionKey(ServerSessionKey, Client信息,票据到期时间) (使用SessionKey加密的ServerSessionKey )
ST (ServerSessionKey, 客户信息 ,票据到期时间)
票据到期时间可以理解成TGS生命周期
Client得到ST后,可以访问server
Client 收到信息后,使⽤Session Key解密获得 (ServerSessionKey, Client信息,TGS生命周期)
Client -> Server (AP-REQ)
发送AP-REQ:
ST
ServerSessionKey(客户信息, 票据到期时间) 记作认证因子2,使用ServerSessionKey加密
Server -> Client(AP-REP)
Server使用NTLM Hash解密ST 得到 (ServerSessionKey, Client信息,票据到期时间)
用ServerSessionKey解密认证因子2 得到 (Client信息,票据到期时间)
然后再校验时间戳和Client信息
校验通过后,客户端即可访问服务端