Что делать? У меня есть
- сервис Soap, выполненный с использованием Java 17 + Spring Boot 3.3.3
- .cer, который использует мой клиент. для подписи запроса
- .cer и .key моего собственного сертификата
- файла .p12 и файла .jks, созданных с помощью команд из Chatgpt< /li>
- Использовать 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 (включая самого себя и все его содержимое).
- Ссылка (внутри SecurityTokenReference) имеет атрибут URI, указывающий на атрибут wsu:Id в BinarySecurityToken (это UUID, который я создаю сам).
- Ссылка (вне SecurityTokenReference), основанная на примерах, которые я нашел в Интернете, имеет атрибут URI, указывающий на атрибут wsu:id, присутствующий в мыле:Body. Я также генерирую это с помощью UUID.
- Отметка времени: я просто устанавливаю текущее время со сроком действия на один час вперед.
Примечания:
- Нет , служба REST не является вариантом.
- Нет, отказ от использования этого стандарта не является вариантом; это нужно сделать так.
- Это нужно сделать в Java 17 + Spring Boot 3+.
Возможно, вы заметили, что я на данный момент не добавляйте код, и это потому, что я больше не знаю, что к чему, другие найденные вопросы SO приводят меня только к другим ошибкам, и то, что я пытаюсь, тоже не работает, поэтому я предпочитаю сказать, что я не знаю, как сделать то, что говорит заголовок этого вопроса, и ответ, который я ищу, - это пример кода о том, как реализовать очень конкретный сценарий, который у меня есть (хотя я буду публиковать свои предыдущие неудачные попытки в качестве ответов в этой теме).
Подробнее здесь: https://stackoverflow.com/questions/790 ... -spring-ws