2012-06-09 5 views
2

Я пытаюсь сделать вызов защищенного web-сервиса с защитой ws-безопасности с сервера, который, к сожалению, не поддерживает это изначально. Подход, который я принял, заключается в реализации .jsp, который действует как обратный прокси-сервер для фактического URL конечной точки, в процессе добавления элемента с элементами ws-security.Реализация пароля для ws-security UsernameToken в Java

Это, кажется, работает достаточно хорошо, и я уверен, что правильно построил XML с правильными пространствами имен и т. Д. Я проверил это, сравнив XML с XML, созданный SOAP-UI.

Проблема заключается в реализации генератора дайджеста паролей. Я не получаю тот же результат, что и SOAP-UI, используя те же самые входы для NOnce, xsd: dateTime и пароль, и следующий код.

StringBuffer passwordDigestStr_ = new StringBuffer(); 

// First append the NOnce from the SOAP header 
passwordDigestStr_.append(Base64.decode("PzlbwtWRpmFWjG0JRIRn7A==")); 

// Then append the xsd:dateTime in UTC timezone 
passwordDigestStr_.append("2012-06-09T18:41:03.640Z"); 

// Finally append the password/secret 
passwordDigestStr_.append("password"); 

System.out.println("Generated password digest: " + new String(com.bea.xbean.util.Base64.encode(org.apache.commons.codec.digest.DigestUtils.sha(passwordDigestStr_.toString())), "UTF-8")); 

Я считаю, что проблема с реализацией хеширование первых двух элементов, как объясняется http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf

Следует отметить, что одноразовое значение хешируется с использованием последовательности октетов его декодированного значения в то время как временная метка хешируется используя октетную последовательность его кодировки UTF8, как указано в содержимом элемента.

Если бы кто-нибудь мог помочь мне решить эту проблему, это было бы здорово, потому что она начинает сводить меня с ума! Было бы идеально, если бы вы могли предоставить исходный код.

+0

Можете ли вы разместить образцы ввода и вывода из SOAP-UI? Таким образом, мы можем попытаться помочь только с Java и вашим кодом, а не с SOAP-UI. –

ответ

8

Я возьму трещину на нем без SOAP-UI. Ввод хэш-функции должен быть байтом, а не строкой. DigestUtils.sha() позволит вам использовать строку, но эта строка должна быть правильно закодирована. Когда вы написали nonce, вы звонили StringBuffer.append(Object), который заканчивается вызовом byte[].toString(). Это дает вам что-то вроде [[email protected], определенно не то, что вы хотите. Используя байты везде, вы должны избегать этой проблемы. Обратите внимание, что приведенный ниже пример использует org.apache.commons.codec.binary.Base64, а не тот класс Base64, который вы использовали. Это не имеет значения, это только то, что мне было удобно.

ByteBuffer buf = ByteBuffer.allocate(1000); 
buf.put(Base64.decodeBase64("PzlbwtWRpmFWjG0JRIRn7A==")); 
buf.put("2012-06-09T18:41:03.640Z".getBytes("UTF-8")); 
buf.put("password".getBytes("UTF-8")); 
byte[] toHash = new byte[buf.position()]; 
buf.rewind(); 
buf.get(toHash); 
byte[] hash = DigestUtils.sha(toHash); 
System.out.println("Generated password digest: " + Base64.encodeBase64String(hash)); 
+0

Спасибо за быстрый ответ. Я пробовал этот фрагмент, и он выводит еще один пароль для моего кода и SOAP-UI. Я действительно думал, что проблема, с которой я сталкиваюсь, имеет какое-то отношение к кодировке символов. Я вижу, что мой подход с использованием StringBuffer явно ошибочен. Вы можете настроить SOAP-UI и посмотреть, дает ли ваш алгоритм равные результаты? Возможно, я неправильно настроил SOAP-UI! –

+0

Я попытался загрузить его, но это не сработало сразу, и я не хочу тратить кучу времени на общение с ним. Можете ли вы просто приложить некоторые примерные значения ввода и вывода из вашей копии пользовательского интерфейса SOAP? –

+0

Я отправил ответ и наградил вас очками. У меня возникла вторичная проблема, проверяя это с точки зрения представления данных/времени.Этот клиент webservice работает в Великобритании, и мы в настоящее время UTC + 1 = BST (британское летнее время). Однако теперь вебсервис ожидает значений dateTime с суффиксом «Z» в представлении, поэтому я ожидал, что вам нужно будет отправить дату, отформатированную как один час в прошлом (UTC). Тем не менее, он по-прежнему хочет, чтобы компонент часа был часовым представлением BST, которое я считаю нечетным. Согласны ли вы, что это не соответствует типу данных даты даты XML? –

1

Извинения за задержку в ответе, особенно учитывая ваш первоначальный быстрый ответ. Теперь я смог заставить это работать, используя сущность вашего подхода, чтобы избежать каких-либо проблем с кодировкой символов. Однако java.nio.ByteBuffer вызвал у меня проблемы, поэтому я изменил код, чтобы использовать базовые byte[] s, которые я объединил с помощью System.arrayCopy(). Проблема, с которой я столкнулась с java.nio.ByteBuffer, заключалась в том, что, несмотря на то, что buf.position() возвращает соответствующее количество байтов, все байты, введенные в byte[] toHash через buf.get(toHash), равны 0 с!

Большое спасибо за помощь.