需要避免数字签名公共证书BinarySecurityElement被mtom编码

时间:2013-10-25 20:54:39

标签: c# .net wcf ws-security mtom

我遇到了一个似乎无法解决的问题。使用wcf和ws security来使用基于java的Web服务。使用非mtom请求,公钥证书将作为binary64字符串的一部分发送到binarysecurityelement。但是,对于mtom请求,相同的证书是mtom编码的。有没有办法可以避免使用wcf,以便公钥证书在binarysecurityelement中作为嵌入式base 64字符串发送,而不是作为soap请求信封下面的multipart部分发送?

对于具有公钥的证书,这是一个RSA(2048位),适用于具有公钥的证书:RSA(1024位)

因此,使用具有RSA 2048位公钥的证书会发生如下情况:

<o:BinarySecurityToken u:Id="uuid-4d4ee765-5717-4d53-9ac9-99bddc07df6c-2" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
        <xop:Include href="cid:http%3A%2F%2Ftempuri.org%2F1%2F632618206525089430" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
      </o:BinarySecurityToken>

相反,我需要嵌入base64证书值而不是xop:include元素。对于具有RSA 1024位公钥的证书,这是正确的。

我有一个自定义编码器来编写消息,但我似乎找不到任何特定的覆盖方法,这将允许我修改请求中生成binarysecurity令牌的方式。想法?

不确定自定义编码器是否也会在这里提供帮助,使用xmlwriter对文件调用消息对象上的writemessage。我可以看到binarysecuritytoken包含一个base64字符串,我相信它是证书原始字节。它之后可能是消息被优化了吗?

1 个答案:

答案 0 :(得分:0)

我在这里看不到一个简单的方法。你可以一起禁用MTOM,但是它会优化二进制数据。它有一个内部threashold我认为你不能配置(从一定大小的消息中移出二进制数据是经济有效的。)

如果你想尝试这个,那么你可能需要实现一个与MTOM编码器非常相似的custom message encoder(所以在反射器中查看代码),也许你甚至可以在内部调用它。您想要替换的是XmlMtomWriter的实例化。在你自己的编写器中,在writeBase64()方法之上,如果数据没有通过threashold,它将委托给writeString。您可以通过在源调试模式下使用.Net并将断点放在正确的位置来完成整个场景的干运行。