Мы проверяем полезную нагрузку подписи на сертификат.Иногда мы получаем запросы без указания какого-либо атрибута «Id», и, следовательно, validationContext не будет установлен с какими-либо атрибутами Id.В этом случае мы получаем исключение «Идентификатор не является атрибутом».Если я пропущу установку valContext.setIdAttributeNS, мы получим следующее исключение, когда Id присутствует в нескольких запросах:
javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID ID-23a2b5ac-1286-4e33-b38f-77350195d92a
Есть ли способ пропустить часть valContext.setIdAttributeNS?,Ниже приведен фрагмент кода.
private boolean validateSignature(final Document doc, final PublicKey publicKey) {
LOG.error("In validateSignature");
boolean signatureIsValid = false;
try {
final Node signature = (Node) payLoadSigXPathExpr.evaluate(doc, XPathConstants.NODE);
final Node body = (Node) bodyXPathExpr.evaluate(doc, XPathConstants.NODE);
final Node to = (Node) toXPathExpr.evaluate(doc, XPathConstants.NODE);
final Node messageID = (Node) messageIdXPathExpr.evaluate(doc, XPathConstants.NODE);
final Node replyTo = (Node) replyToXPathExpr.evaluate(doc, XPathConstants.NODE);
final Node action = (Node) actionXPathExpr.evaluate(doc, XPathConstants.NODE);
// Create a DOMValidateContext and specify a KeyValue KeySelector
// and document context
final DOMValidateContext valContext = new DOMValidateContext(KeySelector.singletonKeySelector(publicKey),
signature);
LOG.error("body::"+nodeToString(body));
if(null != body.getAttributes().getNamedItem("Id")){
LOG.error("inside getNamedItem Id");
LOG.error("getNamedItem Id::"+body.getAttributes().getNamedItem("Id").getNodeValue());
valContext.setIdAttributeNS((Element) body,
null, Constants.ID_STRING);
}
if(null != body.getAttributes().getNamedItem("wsu:Id") || null != body.getAttributes().getNamedItem("u:Id")){
LOG.error("inside getNamedItem wsu:Id");
LOG.error("getNamedItem wsu:Id::"+body.getAttributes().getNamedItem("wsu:Id").getNodeValue());
valContext.setIdAttributeNS((Element) body,
Constants.WSSE_SECURITY_UTILITY_NS, Constants.ID_STRING);
}
if (null != messageID) {
LOG.error("messageID::"+nodeToString(messageID));
valContext.setIdAttributeNS((Element) messageID,
Constants.WSSE_SECURITY_UTILITY_NS, Constants.ID_STRING);
}
if (null != replyTo) {
LOG.error("replyTo::"+nodeToString(replyTo));
valContext.setIdAttributeNS((Element) replyTo,
Constants.WSSE_SECURITY_UTILITY_NS, Constants.ID_STRING);
}
if (null != to) {
LOG.error("to::"+nodeToString(to));
valContext.setIdAttributeNS((Element) to,
Constants.WSSE_SECURITY_UTILITY_NS, Constants.ID_STRING);
}
if (null != action) {
LOG.error("action::"+nodeToString(action));
valContext.setIdAttributeNS((Element) action,
Constants.WSSE_SECURITY_UTILITY_NS, Constants.ID_STRING);
}
// Unmarshal the XMLSignature.
final XMLSignature xmlSignature = fac.unmarshalXMLSignature(valContext);
// Validate the XMLSignature.
signatureIsValid = xmlSignature.validate(valContext);
} catch (final Exception ex) {
LOG.error("Signature Validation Exception:{}",ex);
}
return signatureIsValid;
}