Проверьте подпись запроса и подпишите ответ в службах SOAP с помощью Spring-WS.JAVA

Программисты JAVA общаются здесь
Anonymous
Проверьте подпись запроса и подпишите ответ в службах SOAP с помощью Spring-WS.

Сообщение Anonymous »

Предпосылка: мне нужно создать службу SOAP, использующую стандарт WS-Security, чтобы выполнять то, что описано в заголовке, чтобы клиент SOAP мог использовать эту службу.
Что делать? У меня есть
  • сервис Soap, выполненный с использованием Java 17 + Spring Boot 3.3.3
  • .cer, который использует мой клиент. для подписи запроса
  • .cer и .key моего собственного сертификата
  • файла .p12 и файла .jks, созданных с помощью команд из Chatgpt< /li>
По сути, это включает отправку сертификата (файла .cer) в мыле: заголовок отправляемого/полученного конверта. Однако на пути к этому я столкнулся с рядом трудностей. Судя по тому, что я видел, у меня есть только два варианта:
  • Использовать WS-Security из Spring Boot с классом Wss4jSecurityInterceptor.
  • Захватите исходящее сообщение SOAP в SoapEndpointInterceptor и добавьте соответствующие поля.
Ни один из этих подходов мне не помог.

Ни один из этих подходов мне не помог.

Ни один из этих подходов мне не помог.

p>
Сценарий 1:
После многих вопросов и тонких настроек с помощью моего чата-gpt/gemini все, что я получаю, это код с выдуманными методами или другими. это не делает то, что мне нужно. Я прочитал документацию библиотеки, и методы не объясняют, откуда брать значения и как их вычислять.
Поэтому я прибегаю к методу проб и ошибок, следуя имеющейся информации. Я передаю файл crypto.properties вместе с файлом .p12, содержащим мои .cer и .key с действительным паролем и псевдонимом. Я также пробовал использовать файл .jks, но в обоих случаях получаю такие ошибки, как «неопознанный символ 111» или что библиотека не была инициализирована должным образом.
В целом я стараюсь все методы класса, использующие форматы p12 и jks, а также файл crypto.properties, но служба либо не запускается, либо не может подписать, вместо этого отправляя ответ 202 с пустым телом в мою конечную точку.
Результат? Служба даже не запускается из-за вышеупомянутых ошибок.
Сценарий 2:
Используя то и это, я создаю все необходимые теги.
  • BinarySecurityToken: я помещаю .cer преобразуется в base64 с использованием класса X.509Certificate.
  • DigestMethod и SignatureMethod используют SHA-1 и SHA-1withRSA соответственно. .
  • DigestValue: хэш SHA-1, сгенерированный из необработанного содержимого XML в виде строки из мыла:Body (он не включает само тело, только корневой элемент внутри него).
  • SignatureValue: Используя Java-класс Signer, я извлекаю закрытый ключ из файла .p12, созданного на основе моего исходного .cer, и .key (тот же .cer, который используется в BinarySecurityToken), и я подписываю необработанную XML-строку элемента SignedInfo (включая самого себя и все его содержимое).
Если вы посмотрите на две ссылки, которые я использую, вы заметите, что некоторые атрибуты, такие как ID, необходимо учитывать, верно?
  • Ссылка (внутри SecurityTokenReference) имеет атрибут URI, указывающий на атрибут wsu:Id в BinarySecurityToken (это UUID, который я создаю сам).
  • Ссылка (вне SecurityTokenReference), основанная на примерах, которые я нашел в Интернете, имеет атрибут URI, указывающий на атрибут wsu:id, присутствующий в мыле:Body. Я также генерирую это с помощью UUID.
  • Отметка времени: я просто устанавливаю текущее время со сроком действия на один час вперед.
Результат? Когда клиент проверяет мой ответ, он получает исключение «подпись недействительна». Я пробовал использовать самозаверяющие сертификаты, сертификаты, выданные центром сертификации, и сертификаты без специальных символов, но ни один из этих вариантов не изменил результат. Мы также проверили, что .cer на их стороне совпадает с тем, который я использую.
Примечания:
  • Нет , служба REST не является вариантом.
  • Нет, отказ от использования этого стандарта не является вариантом; это нужно сделать так.
  • Это нужно сделать в Java 17 + Spring Boot 3+.
    Возможно, вы заметили, что я на данный момент не добавляйте код, и это потому, что я больше не знаю, что к чему, другие найденные вопросы SO приводят меня только к другим ошибкам, и то, что я пытаюсь, тоже не работает, поэтому я предпочитаю сказать, что я не знаю, как сделать то, что говорит заголовок этого вопроса, и ответ, который я ищу, - это пример кода о том, как реализовать очень конкретный сценарий, который у меня есть (хотя я буду публиковать свои предыдущие неудачные попытки в качестве ответов в этой теме).


Подробнее здесь: https://stackoverflow.com/questions/790 ... -spring-ws

Вернуться в «JAVA»