WSHttpBinding: роль Entropy.BinarySecret в шифровании сообщений. - PullRequest
0 голосов
/ 08 июня 2018

Я пишу простое клиентское приложение SOAP на Python.

Файл WSDL можно найти здесь: https://clients.nationalmailing.com.au/ServiceTest/OrderService.svc?wsdl

К сожалению, сервер объявил об использовании wsHttpBinding в своем файле WSDL иМне пришлось узнать, сколько неприятностей это приносит не-.NET-разработчикам.

У меня есть рабочий код C # (и там все довольно просто), и я использовал Fiddler для захвата трафика и анализа сообщений.Теперь я знаю структуру, которой нужно следовать.Клиент отправляет 2 последовательных сообщения.

Мне удалось создать и отправить первый запрос и получить ответ с сервера.НО второй запрос является более сложным.Я нашел библиотеку signxml , которая помогла мне создать структуру <Signature> со всеми полями, которые должны быть представлены (в соответствии с захваченным трафиком).

Но сервер продолжает отвечать «Ошибка500: при проверке безопасности сообщения произошла ошибка. "

Я понял, что в первом сообщении я поместил только случайные значения для следующей структуры:

<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 голосов
/ 08 июня 2018

Отвечая на мой собственный вопрос.Да, проблема была в неправильном использовании параметра Entropy.

Чтобы подписать сообщение, вам необходимо сгенерировать ключ, он состоит из двух частей (энтропия клиента и энтропия сервера).Они объединяются с алгоритмом P_SHA1 в ключ.

Всем, кто найдет этот пост в будущем: для Python загляните в библиотеку signxml и раздел 4 спецификации ws-trust .

...