【问题标题】:Digital Signature on WCF SOAP messageWCF SOAP 消息上的数字签名
【发布时间】:2011-11-15 15:45:06
【问题描述】:

我需要使用数字签名连接到 Web 服务。我正在使用 .NET 4.0 和 WCF(服务参考)以及 X509 SSL 证书,但找不到任何关于如何正确实现目标的合适说明。

我发现了成百上千篇关于加密肥皂消息、签署数据等的文章和博客等,其中有许多示例使用 X509Certificate1、X509Certificate2、X509Certificate3、DSACryptoServiceProvider、RSACryptoServiceProvider 等所有内容,在web.config,在代码中设置配置,使用 basicHttpBinding 或 wsHttpBinding,或使用 WSE、WSE2、WSE3、ad nauseum。

基本上,我发现了各种对我来说完全没用的信息,因为我无法找到一个完整的示例来说明如何简单地将数字签名添加到肥皂消息中。

通过阅读数字签名的示例,这听起来应该是一个简单的过程,但我找不到一个有用的实现。

有人可以指点我正确的方向吗?

【问题讨论】:

  • “使用数字签名连接到 Web 服务”。这听起来很奇怪。这是否意味着在调用该 Web 服务时需要附加客户端证书?该服务主机还为您提供了哪些其他信息?
  • 是的,没错。除了地址和 wsdl 之外,我真的没有太多其他东西,并且已经与主机交易了证书。我知道该服务是用 Java 编写的,并通过 Apache CFX 托管。我得到的唯一错误是标头中的某些内容与服务预期的标头信息不一致。我可以连接,但没有比这更远的了。
  • 你找到了很多例子,因为有很多变体如何做到这一点。你必须确切地知道你想要达到什么。服务是否已经实施?它是否在 WSDL 中有 WS-SecurityPolicy 断言来描述必须如何准确地对消息进行签名?如果是,请将该断言发布到您的问题中。如果没有,请联系服务提供商并询问消息签名部分的确切描述。
  • 正确!我同意所有可用的样本和信息——甚至来自 MSDN——都是完全没用的。所以。实际上是最好的,但是看——你甚至没有得到一个像样的答案……我的搜索还在继续……手工制作该死的 SOAP 请求会更容易。
  • 这个帖子对我很好:stackoverflow.com/questions/4666970/…

标签: wcf web-services


【解决方案1】:

我认为这取决于 WCF 绑定中的安全设置。如果您只是在寻找 SOAP 消息的结构,请使用 .NET 创建一个客户端并为该服务启用消息日志记录。这将记录来回发送的每条消息。我必须这样做一次,发现 WCF 使用的数据编码 (TLSNego) 是专有的,因此非 WCF 客户端将无法工作。

【讨论】:

  • 幸运的是,我已经能够运行它,但我在 xml 中没有看到任何签名信息。
  • 您的绑定有什么类型的安全性?如果是消息级别,您将在正文中看到第一条消息,即 RequestSecurityToken,“签名”为 base64binary 数据类型。
【解决方案2】:

答案有点晚了,但希望这可能对登陆这里的人有所帮助...

使用 WCF 客户端连接到使用 WS-Security 的 SOAP 服务以及消息上的数字签名意味着您必须使用自定义客户端绑定。某些细节可能因您的服务而异,例如,服务 WSDL(或服务提供者可能会告诉您是否无法获取 WSDL)可能会定义不同的消息安全版本,但我使用客户端配置完成了这项工作像这样:

<bindings>
    <customBinding>
        <binding name="WSHttpBinding_IService">
            <security defaultAlgorithmSuite="Default" authenticationMode="SecureConversation"
                requireDerivedKeys="true" includeTimestamp="true" messageProtectionOrder="SignBeforeEncrypt"
                messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
                requireSignatureConfirmation="false" canRenewSecurityContextToken="true">
                <secureConversationBootstrap defaultAlgorithmSuite="Default"
                    authenticationMode="MutualSslNegotiated" requireDerivedKeys="true"
                    includeTimestamp="true" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
                    requireSignatureConfirmation="false">
                    <localClientSettings detectReplays="true" />
                    <localServiceSettings detectReplays="true" />
                </secureConversationBootstrap>
                <localClientSettings detectReplays="true" />
                <localServiceSettings detectReplays="true" />
            </security>
            <textMessageEncoding />
            <httpTransport />
        </binding>
    </customBinding>
</bindings>

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多