1. Body elementinin id olarak işaretlendiği ve imzanın doğrulandığı kod.

    Bu durum sadece imzanın referansının body olduğu bilinirse tercih edilmelidir.

import org.apache.xml.security.signature.XMLSignature;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.ByteArrayInputStream;
import java.security.cert.X509Certificate;


if (credential_certificate== null) {
    requestErrorMessageToTargetAPI="İstemci sertifikası bulunamadı.";
    statusCodeToTargetAPI=400;
    return;
}

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder builder = dbf.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(requestBodyTextFromClient.getBytes()));

// <soap:Body> elementini bul
NodeList bodyNodes = doc.getElementsByTagNameNS("http://schemas.xmlsoap.org/soap/envelope/", "Body");
if (bodyNodes.getLength() > 0) {
    Element bodyElement = (Element) bodyNodes.item(0);
    // wsu:Id attributunu ID olarak ayarla
    bodyElement.setIdAttributeNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Id", true);
}

NodeList nl = doc.getElementsByTagNameNS(javax.xml.crypto.dsig.XMLSignature.XMLNS, "Signature");
if (nl.getLength() == 0) {
    requestErrorMessageToTargetAPI="İmza bulunamadı.";
    statusCodeToTargetAPI=400;
    return;
}

// XMLSignature'ı belgeden yükleyin
XMLSignature signature = new XMLSignature((Element) nl.item(0), doc.getDocumentURI());
 
 
boolean isValid = signature.checkSignatureValue(credential_certificate);
if (isValid) {
   requestHeaderMapToTargetAPI.put("isValid",isValid);
} else {
    requestErrorMessageToTargetAPI="İmza geçerli değil.";
    statusCodeToTargetAPI=401;
    return;
}
GROOVY

2. Id attribute değerine sahip tüm elementlerin id olarak işaretlendiği ve imzanın doğrulandığı kod.
    Bu durum imzanın referans(lar)ının hangi element olduğu bilinmediği durumlarda ve xml boyutunun nispeten küçük olduğu durumlarda tercih edilmelidir. (Çünkü tüm elementlerde arama yapılmaktadır)

import org.apache.xml.security.signature.XMLSignature;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.ByteArrayInputStream;
import java.security.cert.X509Certificate;

if (credential_certificate== null) {
    requestErrorMessageToTargetAPI="İstemci sertifikası bulunamadı.";
    statusCodeToTargetAPI=400;
    return;
}

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder builder = dbf.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(requestBodyTextFromClient.getBytes()));


NodeList nl = doc.getElementsByTagNameNS(javax.xml.crypto.dsig.XMLSignature.XMLNS, "Signature");
if (nl.getLength() == 0) {
    requestErrorMessageToTargetAPI="İmza bulunamadı.";
    statusCodeToTargetAPI=400;
    return;
}

// ID'si olan elementleri doğru şekilde ID olarak kaydet
NodeList allElements = doc.getElementsByTagName("*");
for (int i = 0; i < allElements.getLength(); i++) {
    Element element = (Element) allElements.item(i);
    if (element.hasAttribute("wsu:Id")) {
        element.setIdAttribute("wsu:Id", true); // Elementi DOM'da ID olarak işaretle
    }
}

//XMLSignature'ı belgeden yükleyin
XMLSignature signature = new XMLSignature((Element) nl.item(0), doc.getDocumentURI());

boolean isValid = signature.checkSignatureValue(credential_certificate);
if (isValid) {
   requestHeaderMapToTargetAPI.put("isValid",isValid);
} else {
    requestErrorMessageToTargetAPI="İmza geçerli değil.";
    statusCodeToTargetAPI=401;
    return;
}
    
GROOVY

3. İmza elementi içindeki referans verilen id'ye sahip olan elementlerin Xpath ile bulunup id olarak işaretlendiği ve imzanın doğrulandığı kod.
    Bu durum imzanın referans(lar)ının hangi element olduğu bilinmediği durumlarda ve xml boyutunun nispeten büyük olduğu durumlarda tercih edilmelidir. (Çünkü tüm elementlerde arama yapılması yerine xpath ile sadece ilgili idye sahip elementler işaretlenmektedir.)

package xml;

import com.apinizer.common.util.SimpleNamespaceContext;
import org.apache.xml.security.signature.Reference;
import org.apache.xml.security.signature.XMLSignature;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import java.io.ByteArrayInputStream;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
 

if (credential_certificate== null) {
    requestErrorMessageToTargetAPI="İstemci sertifikası bulunamadı.";
    statusCodeToTargetAPI=400;
    return;
}

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder builder = dbf.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(requestBodyTextFromClient.getBytes()));

//İmzayı bul
NodeList nl = doc.getElementsByTagNameNS(javax.xml.crypto.dsig.XMLSignature.XMLNS, "Signature");
if (nl.getLength() == 0) {
    requestErrorMessageToTargetAPI="İmza bulunamadı.";
    statusCodeToTargetAPI=400;
    return;
}


// XMLSignature yükle
XMLSignature signature = new XMLSignature((Element) nl.item(0), doc.getDocumentURI());


//referanslari id olarak işaretle
XPath xpath = XPathFactory.newInstance().newXPath();
Map<String, String> map = new HashMap<>();
map.put("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
SimpleNamespaceContext nsContext = new SimpleNamespaceContext(map);
xpath.setNamespaceContext(nsContext);

for (int i = 0; i < signature.getSignedInfo().getLength(); i++) {
    Reference ref = signature.getSignedInfo().item(i);
    String uri = ref.getURI();
    if (uri != null) {
        String id = uri;
        if (id.startsWith("#")) {
            id = id.substring(1);
        }
        String expression = String.format("//*[@wsu:Id='%s']", id);
        Element refElem = (Element) xpath.evaluate(expression, doc, XPathConstants.NODE);
        if (refElem != null) {
            refElem.setIdAttributeNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Id", true);
        }
    }
}


boolean isValid = signature.checkSignatureValue(credential_certificate);
if (isValid) {
   requestHeaderMapToTargetAPI.put("isValid",isValid);
} else {
    requestErrorMessageToTargetAPI="İmza geçerli değil.";
    statusCodeToTargetAPI=401;
    return;
}
     
GROOVY