当客户端生成的服务票证发送到服务器时,GSSContext acceptSecContext方法是解码由KDC编码的此类票证。
当使用服务票证作为其参数调用此方法时,票证是否实际发送到 KDC 本身进行解码?
否则这不是安全问题吗? 因为如果服务器可以解码任何有效的票证,那么除了发送给它的某些客户端或票证是针对什么或谁之外,它一无所知?
有点困惑
任何澄清将不胜感激。
我已经读到应用程序服务器和 KDC 确实可以通信,但我认为这并不总是正确的。
例如,查看示例服务器代码
应用程序服务器登录以获取上下文
LoginContext loginCtx = null;
loginCtx = new LoginContext("SPN", new LoginCallbackHandler( id, password ));
loginCtx.login();
Subject subject = loginCtx.getSubject();
然后使用该 sujbect,它将执行 previlege doAs
Subject.doAs( subject, new PrivilegedAction<String>() {
public void run() {
try {
GSSManager manager = GSSManager.getInstance();
GSSContext context = manager.createContext( (GSSCredential) null);
context.acceptSecContext( serviceTicket, 0, serviceTicket.length);
// now do something with decoded ticket
}
...
}
实际上是发送到KDC本身进行解码的吗?
否,应用程序服务器和KDC
不通信。
这就是为什么在使用系统之前,您必须将KDC
上生成的keytab
复制到应用程序服务器上的原因。
服务器尝试解密票证,如果他能够这样做,那么他假设票证是由KDC
生成的,因为他是唯一知道密码的人,那么它是一个有效的票证。
在系统有效开启之前预先共享密钥/密码,然后从不通过网络发送密钥/密码是许多身份验证协议中的常见机制,例如半径