URI в цифровой подписи XML
У меня есть это в SignedInfo
<ds:Reference URI="#Id-body">
<ds:transform>
...
...
Весь XML-файл выглядит так
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
...
</soapenv:Header>
<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-body">
<ns4:message>
...
...
</ns4:message>
</soapenv:Body>
</soapenv:Envelope>
Я пишу Java-программу для расчета значения дайджеста для цифровой подписи. Я думал, что следующий контент должен быть хэширован, но я получаю сообщение об ошибке, в котором говорится, что "префикс"soapenv "для элемента"soapenv:Body"не связан." Итак, мой вопрос: какой контент следует использовать для получения значения дайджеста?
<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-body">
<ns4:message>
...
...
</ns4:message>
</soapenv:Body>
Мой код:
org.apache.xml.security.Init.init();
String test = "<soapenv:Body .....</sopaenv:Body>";
rawXmlBytes = test.getBytes();
Canonicalizer canon = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_EXCL_WITH_COMMENTS);
byte[] canonXmlBytes = canon.canonicalize(rawXmlBytes);
MessageDigest md = MessageDigest.getInstance("SHA-1");
Base64 base64 = new Base64();
String digestValue = base64.encodeToString(md.digest(canonXmlBytes));