最近公司在做单点登录的选型,看了看Kerberos的技术实现。感觉网上Kerberos的相关资料不多,自己做了总结和大家分享,因为是在选型阶段,没做太深入的学习,学习了Kerberos的单点登录过程。
Kerberos基本原理
先转几个链接
1.关于理解Kerberos原理的经典对话,MIT的人为了帮助人们理解Kerberos的原理而写的一篇对话集,google “Kerberos的原理”,满篇都是。
2.谈谈基于Kerberos的Windows Network Authentication - Part I、II、III,挺好挺详细的文章,一共三篇,值得一看。
http://www.cnblogs.com/artech/archive/2007/07/05/807492.html
3. 单点登录(SSO)的核心--kerberos身份认证协议技术参考(一),也是一系列三篇文章
http://chnking.cnblogs.com/archive/2006/03/07/344506.html
下面是自己的原创整理
Kerberos登录过程
名字解释
KDS:Kerberos Distribution Center 认证中心
TGT:Ticket Granting Ticket 身份凭证
Master Key:真正的密钥的Hash,Client、KDC、Server均有自己的Master Key
Session Key:这种Key只在一段时间有效,用于加密双方传输的部分数据包
SKDC-Server:Server和KDC间的Session Key
SKDC-Client:Client和KDC间的Session Key
1. Authentication Service Exchange
这一步骤KDC实现了对Client的认证,同时KDC向Client颁发了一个身份凭证TGT,Client可凭此TGT向KDC申请用于访问某个Server的Ticket。
1.1. Client向KDC的Authentication Service服务发送KRB_AS_REQ,目的是申请获取一个用以访问所有Server的凭证(TGT);
KRB_AS_REQ包含:
l Pre-authentication data:一个被Client Master Key加密的Timestamp,用于KDC验证客户端身份;
l Client Info:Client标识,KDC以此查找Client的Master Key;
l Server Info:此处并不是Client要访问Server的Server Name,实际上是KDC的Ticket Granting Service
1.2. AS(Authentication Service服务)根据Client Info从KDC中提取Client Master Key,解密Pre-authentication data,如果Timestamp合法,则客户端通过验证,因为这个Master Key仅Client和KDC知道;
1.3. AS将KRB_AS_REP发送给客户端
KRB_AS_REP包含:
l 被Client Master Key加密过的SKDC-Client
l 被KDC Key加密过的TGT,TGT(SKDC-Client + Client Info + End Time),此TGT记做Client的TGT
2. KRB_TGT
这一步骤Client获得了Server的TGT,此TGT封装了SKDC-Server,该Session Key会用于加密后续步骤中的Ticket
2.1. Client接收到KRB_AS_REP后,使用Client Master Key对第一部分进行解密,可获得SKDC-Client,之后向Server申请获取Server的TGT,此TGT中封装了SKDC-Server;
2.2. Server将KRB_AP_REP返回给Client;
KRB_AP_REP包括:
l 被KDC Key加密过的TGT,TGT(SKDC-Server + Server Info + End Time),此TGT记做Server的TGT
注:Server的TGT可如同步骤1由Server向KDC申请,并将申请到的TGT缓存到Server中。Client向Server获取时可直接将其返回,否则需通过AS Exchange由Server向KDC获取。
3. TGS(Ticket Granting Service)Exchange
这一步骤Client向KDC提供TGT,KDC验证TGT通过后向Client颁发访问Server的Ticket
3.1. Client获得Server TGT后,向KDC中的TGS(Ticket Granting Service)发送KRB_TGS_REQ,申请用于访问Server 的Ticket;
KRB_TGS_REQ包含:
l Client的TGT:在步骤1处生成,由KDC Master Key加密
l Server的TGT:在步骤2处生成,由KDC Master Key加密
l Authenticator(Client Info +Timestamp):用来证明Client TGT是自己所拥有的,所以需要用SKDC—Client加密
l Client Info:Client标识
l Server Info: Client试图访问的那个Server
3.2. KDC先用KDC Master Key解密Client的TGT,获得SKDC-Client;
3.3. 使用SKDC—Client解密Authenticator,通过比对3.2和3.3步骤中分别获得的Client Info可验证发送者是否是Client TGT的真正拥有者;
3.4. KDC再用KDC Master Key解密Server的TGT获得SKDC-Server;
3.5. 验证通过后,向Client发送KRB_TGS_REP
KRB_TGS_REP 包含:
l 使用SKDC-Client加密的SServer-Client
l 使用SKDC-Server加密的Session Ticket,该Ticket中包括SServer-Client、Client name、End Time(Ticket到期时间)
4. CS(Client/Server )Exchange
Client接收到KRB_TGS_REP 后,使用SKDC-Client解密可获得SServer-Client,有了SServer-Client和Ticket,Client就可以与Server进行交互而无需通过KDC。
这一步骤完成了Server对Client的认证。
4.1. Client接收到KRB_TGS_REP后,使用SKDC-Client对第一部分解密可获得SServer-Client,随后创建Authenticator并使用SServer-Client加密
4.2. Client向Server发送KRB_AP_REQ
KRB_AP_REQ包含内容:
l Session Ticket(Client Info + SServer-Client+ End Time)
l Authenticator (Client Info + Timestamp)
l 是否需要进行双向验证的Flag
4.3. Server使用SKDC-Server解密Ticket获得 SServer-Client;
4.4. 使用SServer-Client解密Authenticator,通过比较Authenticator中的Client Info和Ticket中的Client Info实现对Client的验证。