以下链接描述了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}}
问题
使用MutualAuthRequired
与NegotiateStream
之间的安全性区别是什么?
每种解决方案中使用的标准是什么(例如MS-SPNG)?
正在使用哪些Windows子系统(SIP,GSS-API等)?
任何可以帮助我将Linux代理集成到此Kerberos / SpNego解决方案中的信息都是理想的。
答案 0 :(得分:1)
这都是关于运输类型的差异。在这里,您有两种不同的传输方式:
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
握手的限制。客户端将仅通过网络发送协商初始化消息,服务器将做出响应,如果他们同意,则可以开始相互发送加密的消息。