发现安全示例

发现规范并不要求参与发现过程的终结点必须是安全的。 使用安全性增强发现消息可缓解各种类型的攻击(消息更改、拒绝服务、重播、欺骗)。

DiscoveryScenario 示例实现使用压缩签名格式(WS-Discovery 规范第 8.2 节中所述)计算和验证消息签名的自定义通道。 此示例支持 2005 发现规范1.1 版本

自定义通道应用于发现和公告终结点的现有通道堆栈顶部。 这样,对于发送的每个消息都应用一个签名标头。 签名在收到的消息上进行验证,如果签名不匹配或消息没有签名,则会丢弃这些消息。 为了对消息进行签名和验证,该示例使用证书。

讨论

WCF 可扩展,允许用户根据需要自定义通道。 此示例实现了一种用于生成安全通道的发现安全绑定组件。 安全通道应用并验证消息签名,并应用于当前堆栈的顶部。

安全绑定元素用于创建安全通道工厂和通道侦听器。

安全通道工厂

安全通道工厂创建输出或双工通道,这些通道向消息标头添加精简签名。 若要使消息尽可能小,请使用压缩签名格式。 以下示例显示了压缩签名的结构。

<d:Security ... >
  [<d:Sig Scheme="xs:anyURI"
         [KeyId="xs:base64Binary"]?
          Refs="..."
         [PrefixList]="xs:NMTOKENS"
          Sig="xs:base64Binary"
          ... />]?
  ...
</d:Security>

注释

在 2008 年的 Discovery 版本协议中添加了 PrefixList

为计算签名,示例确定扩展的签名项。 根据 WS-Discovery 规范的要求,使用SignedInfo命名空间前缀创建 XML 签名(ds)。 发现和寻址命名空间中的正文和所有标头都在签名中引用,因此它们不能被篡改。 每个引用的元素都使用专用规范化 (http://www.w3.org/2001/10/xml-exc-c14n#) 进行转换,然后计算 SHA-1 摘要值 (http://www.w3.org/2000/09/xmldsig#sha1)。 根据所有引用的元素及其摘要值,签名值是使用 RSA 算法 (http://www.w3.org/2000/09/xmldsig#rsa-sha1) 计算的。

这些消息使用客户端指定的证书进行签名。 创建绑定元素时,必须指定存储位置、名称和证书使用者名称。 KeyId压缩签名表示签名令牌的密钥标识符,是签名令牌的使用者密钥标识符(SKI),或者(如果 SKI 不存在)签名令牌的公钥的 SHA-1 哈希。

安全通道侦听器

安全通道侦听器创建输入或双工通道,这些通道验证接收的消息中的精简签名。 若要验证签名,消息中附加的压缩签名指定的 KeyId 将用于从指定的存储区中选择证书。 如果消息没有签名或签名检查失败,则丢弃消息。 为使用安全绑定,本示例定义一个工厂,该工厂使用添加的发现安全绑定元素创建自定义 UdpDiscoveryEndpointUdpAnnouncementEndpoint。 这些安全终结点可以用于发现公告侦听器和可发现服务。

示例详细信息

此示例包括库和 4 个控制台应用程序:

  • DiscoverySecurityChannels:公开安全绑定的库。 库计算并验证传出/传入消息的压缩签名。

  • Service:公开 ICalculatorService 协定的自承载服务。 该服务标记为可发现。 用户通过指定用于对消息进行签名的证书的存储位置和名称,以及证书的使用者名称或其他唯一标识符,来详细说明证书的相关信息。此外,还需指定客户端证书所在的存储位置(这些证书用于检查传入消息的签名)。 基于这些详细信息,生成并使用了具有添加安全性的 UdpDiscoveryEndpoint。

  • 客户端:这个类尝试发现ICalculatorService,并调用服务上的方法。 同样,构建了一个包含附加安全性的 UdpDiscoveryEndpoint,用于对消息进行签名和验证。

  • AnnouncementListener:一种自托管服务,用于侦听在线和离线公告,并使用安全公告终结点。

注释

如果 Setup.bat 多次运行,证书管理器会提示你选择要添加的证书,因为存在重复的证书。 在这种情况下,应该中止 Setup.bat,并调用 Cleanup.bat,因为副本已经被创建。 Cleanup.bat 还会提示你选择要删除的证书。 从列表中选择一个证书,并继续执行 Cleanup.bat,直到没有证书剩余。

使用此示例

  1. 从 Visual Studio 开发人员命令提示符执行 Setup.bat 脚本。 此示例使用证书对消息进行签名和验证。 该脚本使用 Makecert.exe 创建证书,然后使用 Certmgr.exe安装证书。 必须使用管理员权限运行脚本。

  2. 若要生成并运行示例,请在 Visual Studio 中打开Security.sln文件,然后选择“ 全部重新生成”。 更新解决方案属性以启动多个项目:为 DiscoverySecureChannels 以外的所有项目选择 “开始 ”。 正常运行解决方案。

  3. 完成示例作后,请执行删除为此示例创建的证书的 Cleanup.bat 脚本。