Разница между ожидаемым и фактическим дайджестом в веб-службе CXF (Java)

#java #web-services #soap #digital-signature

#java #веб-сервисы #soap #цифровая подпись

Вопрос:

 16:56:06,477 DEBUG DOMReference:398 - Expected digest: 3BXXHthnTP9kC1YB6FPUrpnO72wNuPmWerwglakCGiY=
16:56:06,477 DEBUG DOMReference:399 - Actual digest: hesLZ/G8ekBPdFNGrxIJmxSYhhMC/BBHD6x/pHqXJt4=
16:56:06,477 DEBUG DOMXMLSignature:276 - Reference[#Body] is valid: false 
  

У меня есть веб-сервис, выполненный в CXF, и я создал клиент, просто используя утилиты javax.xml.crypto
package. На стороне клиента, когда я проверяю действительность подписи, она говорит, что она действительна. Где у меня есть дайджест раздела тела как «3BXXHhtnTP9kC1YB6FPUrpnO72wNuPmWerwglakCGiY =».

Затем отправляется сгенерированное SOAP-сообщение, и на стороне веб-службы говорится, что фактический дайджест — это что-то другое, но не то, что я получил на стороне клиента.

Кто-нибудь может пролить свет на это? Спасибо

Ответ №1:

Я читал сообщение SOAP из файла. Были некоторые символы, отличные от UTF8, которые были включены в дайджест. Однако я канонизировал перед дайджестом, который должен исправить такого рода проблемы. Код изменен для чтения только данных UTF-8, и это устранило проблему.

 File attachmentFile = new File("soap_sample.xml");
    FileInputStream fis = new FileInputStream(attachmentFile);
    InputStreamReader isr = new InputStreamReader(fis, "UTF8");
    BufferedReader in = new BufferedReader(isr);

    StringBuffer buffer = new StringBuffer();

    String inputLine = null;
    while ((inputLine = in.readLine()) != null) {
        buffer.append(inputLine);
    }

    InputStream is = IOUtils.toInputStream(buffer.toString(), "UTF-8");

    SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(new MimeHeaders(), is);