WCF SOAP消息上的数字签名

时间:2011-09-12 20:30:54

标签: wcf web-services

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

我发现了数百个帖子和博客等关于加密soap消息,签名数据和批次的内容,大量示例使用X509Certificate1,X509Certificate2,X509Certificate3,DSACryptoServiceProvider,RSACryptoServiceProvider,设置配置中的所有内容。 web.config,在代码中设置配置,使用basicHttpBinding或wsHttpBinding,或使用WSE,WSE2,WSE3,ad nauseum。

基本上,我找到了对我来说完全没用的各种信息,因为我还没有找到一个如何简单地将数字签名添加到soap消息的完整示例。

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

有点迟到的答案,但希望这可能有助于在这里降落的人......

使用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>