Oracle GSSAPI Java示例和各种SPNEGO / GSSAPI IETF RFCs表明,GSS启动器(客户端)和受体(服务器)都应该有一个循环来建立安全上下文,并且在建立安全上下文之前,客户端可能需要使用GSS令牌进行多次传递。
通用安全服务协商循环的https://www.rfc-editor.org/rfc/rfc7546
Microsoft中的
例如,RFC4559给出了这个例子:
传递1:失败,因为请求没有令牌:
C:获取dir/index.html
S: HTTP/1.1 401未经授权
S: WWW-认证:谈判
传递2:失败,但是请求有一个令牌
C:获取dir/index.html
C:授权:谈判a87421000492aa874209af8bc028
S: HTTP/1.1 401未经授权
S: WWW-认证:协商749 efa7b23409c20b92356
传递3:成功
C:获取dir/index.html
C:授权:协商89a8742a8729a8b028
S: HTTP/1.1 200 Success
S: WWW-验证:协商ade0234568a4209af8bc0280289eca
这里建立了安全上下文,因此在第三次传递时对请求进行身份验证。也就是说,在第二次使用令牌从客户端(C)传递到服务器(S)时。
问题1:为什么在成功建立安全上下文之前,可能需要多个从启动器传递到接收方的令牌?为什么可以通过2以上的失败,但通过3成功?在这两道通道之间,引发方或受主是否发生了一些变化?
问题2:我的直觉是,发起者和受主循环都应该对无休止循环有保护作用。例如,如果x尝试没有建立上下文,启动器可能会中止。是否有任何关于传递次数的经验规则/度量标准,可以合理地期望它们建立安全上下文?例如,如果安全上下文在第五次传递时尚未建立->中止。
问题3: Oracle中的示例客户机和服务器通过套接字进行通信。服务器构建一个GSSContext对象,该对象专用于单个客户端,一直保存到服务器关闭为止,因此可用于多次传递以建立安全上下文。
但是,对于具有多个客户端的Http RESTful WebServer,这又如何工作呢?我的假设是:
( a)每次传递建立安全上下文的请求都应该传递给同一个GSSContext对象(而不是针对新的GSSContext实例)。
( b) Http服务器应该为每个新的客户端请求建立一个新的GSSContext实例。(即不应在多个客户端/请求之间共享/重用GSSContext对象)。
如果我的假设是正确的,服务器必须区分:
(一)尚未建立安全背景的现有请求的下列通行证。->应该使用现有的GSSContext对象和循环。
(二)全新请求的第一次通过(来自同一请求或来自不同客户的请求)。->应该使用一个新的GSSContext对象和循环。
发布于 2019-10-08 17:24:38
使用Negotiate作为示例协议,考虑它是如何操作的是很有用的。
H 116服务器接受或拒绝并响应客户端
这需要最多三次往返,并且可能在一次之后失败或完成。其他协议可以选择做任何他们想做的事。
您可能希望跟踪往返次数,并在任意高的次数之后将其杀死。所需资源并不高,但在负载下,它会耗尽系统。
https://stackoverflow.com/questions/58288942
复制相似问题