2

我面临一个我似乎无法解决的问题。使用 wcf 和 ws 安全性使用基于 Java 的 Web 服务。使用非 mtom 请求,公钥证书作为二进制安全元素的一部分作为 base64 字符串发送。但是,对于 mtom 请求,相同的证书是 mtom 编码的。有没有一种方法可以避免使用 wcf,以便公钥证书作为二进制安全元素中的嵌入式 base 64 字符串发送,而不是作为肥皂请求信封下方的多部分部分发送?

这发生在具有公钥的证书是 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 位公钥的证书是正确的。

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

不确定自定义编码器是否也有帮助,使用 xmlwriter 到文件调用消息对象上的 writemessage。我可以看到由 base64 字符串组成的 binarysecuritytoken,我认为它是证书原始字节。它可能在那之后消息是mtom优化的?

4

1 回答 1

0

我在这里看不到简单的方法。您可以一起禁用 MTOM,但它会优化二进制数据。它有一个我认为您无法配置的内部阈值(仅将二进制数据从特定大小的消息中移出是具有成本效益的)。

如果你想尝试这个,那么你可能需要实现一个与 MTOM 编码器非常相似的自定义消息编码器(所以在反射器中查看它的代码),也许你甚至可以在内部调用它。您要替换的是 XmlMtomWriter 的实例化。在您自己的编写器中覆盖 writeBase64() 方法,以便如果数据未通过阈值,它将委托给 writeString。您可以通过让 .Net 处于源代码调试模式并在正确的位置放置断点来对整个场景进行试运行。

于 2013-10-26T23:51:32.313 回答