WSHttpBinding:消息加密中的Entropy.BinarySecret角色

时间:2018-06-08 17:59:41

标签: python soap wshttpbinding wsse

我正在用Python编写一个简单的SOAP客户端应用程序。

可以在此处找到WSDL文件:https://clients.nationalmailing.com.au/ServiceTest/OrderService.svc?wsdl

不幸的是,服务器在其WSDL文件中声明了wsHttpBinding的使用,我不得不了解它给非.NET开发人员带来了多少麻烦。

我有C#代码(并且它非常简单)并使用Fiddler捕获流量并分析消息。现在我知道要遵循的结构。客户发送2个后续消息。

我设法创建并发送第一个请求并从服务器接收响应。但第二个请求是一种更复杂的方式。我找到了一个库signxml,它帮助我创建了<Signature>结构,其中包含应该存在的所有字段(根据捕获的流量)。

但服务器继续回答&#34;错误500:验证邮件的安全性时发生错误。&#34;

我意识到在第一条消息中我只为以下结构添加了随机值:

<s:Body>
        <trust:RequestSecurityToken xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
            <trust:TokenType>http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/sct</trust:TokenType>
            <trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
            <trust:Entropy>
                <trust:BinarySecret
                 u:Id="uuid-0649fd7a-9ae2-4f9f-964c-e3aa5d68e8cd-1" 
                 Type="http://docs.oasis-open.org/ws-sx/ws-trust/200512/Nonce">h/MaeQVSL5Br30Hnt/SAl274flYfZVZyx2Fri9zNuEY=</trust:BinarySecret>
            </trust:Entropy>
            <trust:KeySize>256</trust:KeySize>
        </trust:RequestSecurityToken>
    </s:Body>

BinarySecret的值只是一个用Base64编码的随机字符串。我认为这应该是这个阶段的一个问题。我也没有使用服务器响应中的相同参数。

有人可以解释我应该如何使用Entropy.BinarySecret - 是否应该参与Signature的计算以及如何使用它?

1 个答案:

答案 0 :(得分:0)

回答我自己的问题。是的,问题在于Entropy参数的使用不当。

要对生成密钥所需的消息进行签名,它由两部分组成(客户端熵和服务器的熵)。它们与P_SHA1算法结合成一个密钥。

对于将来发现此帖子的任何人:对于Python,请查看signxml库和ws-trust spec的第4部分。