Я борюсь с внедрением WS-Security в процессе ABL.Выполнение WS-Security в процессе ABL
Представляется возможным, это база знаний: http://knowledgebase.progress.com/articles/Article/P88147 состояния:
- Для исходящего WS-Security, создать SOAP-заголовки, содержащие содержимое WS-Security вручную с помощью клиента OpenEdge Web Service.
Прежде всего, я борюсь с созданием кодировкой Base64 и SHA1 хэш пароля переваривается.
Пароль переваривается в соответствии со спецификацией WS-Security. Source.
Password_Digest = Base64 (SHA-1 (nonce + created + password))
Нонс случайная строка определенной длины, в основном может быть UUID. Nonce кодируется Base64 (он отправляется в заголовок мыла).
Дата создания - это дата в формате «ГГГГ-ММ-ДДХ: ММ: СС.ССС». Миллисекунды являются необязательными. Z для GMT всегда должен быть установлен.
Пароль является паролем, предоставленным поставщиком веб-услуг.
Попытка имитировать этот ответ на SO: Working algorithm for PasswordDigest in WS-Security
PROCEDURE generatePassHash:
DEFINE INPUT PARAMETER pcNonce AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcCreated AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcPassword AS CHARACTER NO-UNDO.
DEFINE OUTPUT PARAMETER pcHash AS CHARACTER NO-UNDO.
DEFINE VARIABLE mBytes AS MEMPTR NO-UNDO.
DEFINE VARIABLE cNonceDecoded AS CHARACTER NO-UNDO.
/* Base64-decode the nonce since it's in encoded format */
ASSIGN
cNonceDecoded = STRING(BASE64-DECODE(pcNonce)).
/* Set size of mempointer */
SET-SIZE(mBytes) = LENGTH(cNonceDecoded) + LENGTH(pcCreated) + LENGTH(pcPassword) + 1.
/* Put the decoded nonce first */
PUT-STRING(mBytes, 1) = cNonceDecoded.
/* Add create time */
PUT-STRING(mBytes, 1 + LENGTH(cNonceDecoded)) = pcCreated.
/* Add password */
PUT-STRING(mBytes, 1 + LENGTH(cNonceDecoded) + LENGTH(pcCreated)) = pcPassword.
/* Create out-data */
pcHash = STRING(BASE64-ENCODE(SHA1-DIGEST(mBytes))).
/* Clean up mempointer */
SET-SIZE(mBytes) = 0.
END PROCEDURE.
DEFINE VARIABLE cNonce AS CHARACTER NO-UNDO.
DEFINE VARIABLE cTimeStamp AS CHARACTER NO-UNDO.
DEFINE VARIABLE cClearPass AS CHARACTER NO-UNDO.
DEFINE VARIABLE cRightAnswer AS CHARACTER NO-UNDO.
ASSIGN
cNonce = "UIYifr1SPoNlrmmKGSVOug=="
cTimeStamp = "2009-12-03T16:14:49Z"
cClearPass = "test8"
cRightAnswer = "yf2yatQzoaNaC8BflCMatVch/B8=".
RUN generatePassHash(cNonce, cTimeStamp, cClearPass, OUTPUT cHash).
MESSAGE "Is:" SKIP cHash SKIP(2)
"Should be:" SKIP
cRightAnswer
VIEW-AS ALERT-BOX INFORMATION TITLE "OK?".
Я предполагаю, что это, возможно, придется сделать либо с меня портя обращение mempointer или тот факт, что все должно быть UTF-8?
NB
Я могу легко произвести тот же ошибочный хэш, как указано в упомянутой выше вопрос с помощью этого простого кода:
MESSAGE STRING(BASE64-ENCODE(SHA1-DIGEST("UIYifr1SPoNlrmmKGSVOug==" + "2009-12-03T16:14:49Z" + "test8"))) VIEW-AS ALERT-BOX
Работает как очарование! У меня была идея, что это было что-то вроде этого, и я помню, что NULL укусил меня раньше ... – Jensd
Однако это не работает на других примерах, которые я получил. Как это: 'ASSIGN cNonce = "VVBXZ0xIVW4 =" cTimeStamp = "2014-10-01T07: 20: 26: 660Z" cClearPass = "AMADEUS" cRightAnswer = "OljgJAghr3NZdXJaQNPRCbJg + ХЕ ="' It. производит другой хеш (bLj ...). Возможно, это связано с различными форматами (base64 и т. Д.) Входных данных? – Jensd
Если я правильно понял, отметка времени может быть отформатирована, но вам нравится, если вы согласны - но 07: 20: 26: 660Z выглядит странно - не должно быть 07: 20: 26.660Z? Как вы уверены, что пример, который вы получили/является/правильным? –