WSHttpBinding: Entropy.BinarySecret 在消息加密中的作用

WSHttpBinding: Entropy.BinarySecret role in message encryption

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

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

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

我有可用的 C# 代码(那里非常简单)并使用 Fiddler 来捕获流量和分析消息。现在我知道要遵循的结构了。客户端发送 2 条后续消息。

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

但服务器继续回答 "Error 500: An error occurred when verifying security for the message."

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

<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 的计算以及如何使用它吗?

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

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

对于以后找到此 post 的任何人:对于 Python,请查看 signxml 图书馆和 ws-trust spec 的第 4 部分。