当客户端生成的服务票证发送到服务器时,GSSContext acceptSecContext方法将对由KDC编码的票证进行解码。
以服务票证作为参数调用此方法时,票证实际上是否已发送到KDC本身以进行解码?
否则这不是安全问题吗?因为如果服务器可以解码任何有效的票证,除了发送给它的某个客户端或该票证的目的或对象之外,它什么都不知道?
有点困惑
任何澄清都将不胜感激。
我已阅读到Application Server和KDC确实可以通信,但我认为并非总是如此。
例如,查看示例服务器代码
应用程序服务器登录以获取上下文
LoginContext loginCtx = null;
loginCtx = new LoginContext("SPN", new LoginCallbackHandler( id, password ));
loginCtx.login();
Subject subject = loginCtx.getSubject();
然后使用该对象,将执行特权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
}
...
}
答案 0 :(得分:1)
实际上是将票证发送到KDC进行解码吗?
否,应用服务器与KDC
不通信。
这就是为什么在使用系统之前必须将keytab
上生成的KDC
复制到应用服务器上的原因。
服务器尝试解密票证,如果他能够解密票证,则他认为票证是由KDC
生成的,因为他是唯一知道密码的人,这是一张有效的车票。
在许多系统中,例如radius
的一种常见机制是在系统有效启动之前预先共享密钥/密码,然后再从不通过网络发送密钥/密码。