使用SPNego / Kerberos的“ NegotiateStream”和“ WebRequest”之间的安全性区别是什么?

时间:2019-05-22 15:18:52

标签: kerberos windows-authentication iis-8.5 spnego gssapi

以下链接描述了a traditional intranet client-server使用Kerberos的套接字通信

public class NegotiateStream : System.Net.Security.AuthenticatedStream
... 
// Request authentication.
NetworkStream clientStream = client.GetStream();
NegotiateStream authStream = new NegotiateStream(clientStream, false); 
...
// Pass the NegotiateStream as the AsyncState object 
// so that it is available to the callback delegate.
IAsyncResult ar = authStream.BeginAuthenticateAsClient(
                  new AsyncCallback(EndAuthenticateCallback), authStream);
... 

另一方面,IIS可以使用我理解的“通过SPNego通过SSL的Kerberos”进行身份验证...(请更正我的术语!)。

在这种SPNego / SSL / Kerberos模式下,我无法使NegotiateStream正常工作,但是在WebRequest.AuthenticationLevel设置为{{ 1}}

enter image description here

问题

  • 使用MutualAuthRequiredNegotiateStream之间的安全性区别是什么?

  • 每种解决方案中使用的标准是什么(例如MS-SPNG)?

  • 正在使用哪些Windows子系统(SIP,GSS-API等)?

任何可以帮助我将Linux代理集成到此Kerberos / SpNego解决方案中的信息都是理想的。

1 个答案:

答案 0 :(得分:1)

这都是关于运输类型的差异。在这里,您有两种不同的传输方式:

  • 任意数据的二进制流
  • HTTP编码数据的HTTP流

HTTP请求和响应具有关于如何验证请求的非常具体的语义,即通过Authorization: [scheme] [token]标头并由响应标头WWW-Authenticate: [Scheme]发起,其中[scheme]通常Negotiate

二进制流是任意的,留给实现者执行他们想要的任何事情。

Negotiate方案是与GSS兼容的软件包,它是一个简单的协议,使客户端和服务器可以协商内部认证协议,例如Kerberos或NTLM。在Windows环境中,这称为SSPI程序包。

GSS或SSPI程序包由一组功能组成,这些功能开始或接受双方之间的握手,然后潜在地加密/解密两方之间的数据(可选地受支持)。这些函数生成可以跨越任何传输的消息,任何传输形式都可以调用这些函数。

WebRequest情况下,该类足够聪明以检测Negotiate头,并调用Windows SSPI函数以获取票证,并传递程序包名称。这主要依靠Kerberos来保护票证本身,但是它不保护HTTP请求中的其他任何内容,因此使用SSL / TLS。

NegotiateStream情况下,有线格式在某种程度上是任意的,但受Negotiate握手的限制。客户端将仅通过网络发送协商初始化消息,服务器将做出响应,如果他们同意,则可以开始相互发送加密的消息。