Хорошо, я решил проблему.
Обычно этот код должен работать в моей ситуации.
//strange static method from apache o.O
org.apache.xml.security.Init.init();
List<WSEncryptionPart> wsEncryptionParts = new ArrayList<>();
WSEncryptionPart somethingPart = new WSEncryptionPart("something","somethingNamespace","");
wsEncryptionParts.add(somethingPart);
sign.addReferencesToSign(wsEncryptionParts);
Тем не менее, он не работает.Всегда выдается исключение:
org.apache.wss4j.common.ext.WSSecurityException: в пакете ресурсов не найдено сообщение с идентификатором «noXMLSig» org / apache / xml / security / resource / xmlsecurity».Исходное исключение: org.apache.wss4j.common.ext.WSSecurityException и сообщение. В пакете ресурсов не найдено сообщение с идентификатором «noEncElement» org / apache / xml / security / resource / xmlsecurity »
Я не смог найти ответ на вопрос, что не так с моим мыльным сообщением или кодом.
Однако после времени отладки org.apache.wss4j.dom.message.WSSecSignature .Я чувствовал, что что-то не так с классом.Я решил изменить метод build (Crypto cr) .
public Document build(Crypto cr) throws WSSecurityException {
LOG.debug("Beginning signing...");
this.prepare(cr);
if (this.getParts().isEmpty()) {
this.getParts().add(WSSecurityUtil.getDefaultEncryptionPart(this.getDocument()));
// --- Here is my edit - And it works!
WSEncryptionPart aaa = new WSEncryptionPart("something","somethingNamespace","");
this.getParts().add(aaa);
// ----------------------------------
} else {
Iterator var2 = this.getParts().iterator();
label33:
while(true) {
while(true) {
if (!var2.hasNext()) {
break label33;
}
WSEncryptionPart part = (WSEncryptionPart)var2.next();
if (part.getId() == null && "STRTransform".equals(part.getName())) {
part.setId(this.strUri);
} else if ("KeyInfo".equals(part.getName()) && "http://www.w3.org/2000/09/xmldsig#".equals(part.getNamespace()) && part.getElement() == null) {
Element keyInfoElement = this.getKeyInfoElement();
part.setElement(keyInfoElement);
}
}
}
}
List<javax.xml.crypto.dsig.Reference> referenceList = this.addReferencesToSign(this.getParts());
this.computeSignature(referenceList);
if (this.bstToken != null) {
this.prependBSTElementToHeader();
}
return this.getDocument();
}
Конечно, решение довольно слабое.Тем не менее, по крайней мере, это работает сейчас.
Проблема существует в самой последней версии:
wss4j-ws-security-dom 2.2.2
wss4j-ws-security-common 2.2.2