NetTcpBinding(读取 WindowsStreamSecurityBindingElement)如何加密/签署消息?
Posted
技术标签:
【中文标题】NetTcpBinding(读取 WindowsStreamSecurityBindingElement)如何加密/签署消息?【英文标题】:How does NetTcpBinding(read WindowsStreamSecurityBindingElement) encrypt/sign messages? 【发布时间】:2011-05-10 09:53:08 【问题描述】:我想了解当“Windows”凭据与传输安全性一起使用时 NetTcpBinding 使用的消息加密和签名机制。如果我的 AD 使用 NTLM 而不是 Kerberos 怎么办?消息是否仍会被签名和加密?如果是,如何?
提前致谢,
阿克沙特
【问题讨论】:
【参考方案1】:简短的回答是,是的,如果您将传输安全保护级别设置为 EncryptAndSign(默认值),则使用 NTLM 身份验证的邮件仍将被签名和加密。
以下是其工作原理的概述:
选择传输安全 配置一个 WindowsStreamSecurityBindingElement 在通道堆栈中。这插入了一个 流升级提供程序(见下文) 在 NetTcpBinding 中,消息 客户与客户之间的交流 服务发生在.NET Message Framing Protocol 内,它提供了 消息框架和机制 客户和服务商谈 流升级,主要用途 这是建立运输 安全。如果有流 中配置的升级提供程序 通道堆栈,这将被调用 在序言阶段 客户端成帧协议 打开频道。 升级 提供者 WindowsStreamSecurityBindingElement 使用 SPNEGO 安全包在客户端和服务器之间调用 SSPI 握手:在 NetTcpBinding 中,这通常会导致 Kerberos 被选为底层安全提供程序(如果可用),但如果不可用则选择 NTLM。 如果 NTLM 是最终的身份验证提供程序,则 SSPI 握手将涉及the NTLM specification 中描述的三段 NTLM 质询-响应令牌交换。该协议包括一种用于交换密钥以进行消息签名和加密的机制。一旦 SSPI 握手生成了适当的安全上下文,此后交换的所有消息都在发送通道堆栈的流升级提供程序中进行签名和加密,并在接收通道堆栈的流升级提供程序中解密和验证,在每种情况下都使用对 NTLM 的调用安全提供者通过抽象的SSPI message support functions。【讨论】:
【参考方案2】:这是 Microsoft 专有的实现,没有正确记录,可能是为了防止入侵者利用它。
据我所知,这通常发生在 TCP 级别,由用户凭据生成特殊令牌并随请求一起传递。这会被 Windows 安全通道拦截并针对 AD 进行身份验证。
此令牌用作加密通信的密钥(或作为生成密钥的基础)。
我想如果你看一下 TCP 数据包,你一定能看到令牌——虽然我从未见过。
【讨论】:
【参考方案3】:如果您在代码中执行所有这些操作,那么您可以找到选项here(搜索“NetTcpBinding”)。传输安全通过Windows builtin TLS。
图表here 应该对您的场景有所帮助。
【讨论】:
以上是关于NetTcpBinding(读取 WindowsStreamSecurityBindingElement)如何加密/签署消息?的主要内容,如果未能解决你的问题,请参考以下文章