2016-11-04 8 views
4

XML 서명을 처리하고 있습니다. 알다시피, 3 가지 유형의 XML 서명이 있습니다 : enveloped, enveloping, detached.XML 서명 파일로 "원본"콘텐츠를 추출하는 방법

자바 표준 API를 사용하여 파일에 서명/확인하는 방법에 대한 멋진 자습서를 찾았지만 (거의) "원본"콘텐츠 데이터를 추출하는 방법을 알고 싶습니다. 특히 :

1) XML 서명 파일의 유효성을 검사 한 후 서명없이 XML 콘텐츠를 "얻는"올바른 방법은 무엇입니까?

2) XML 서명 파일의 유효성을 검사 한 후 "객체"노드를 "얻는"올바른 방법은 무엇입니까?

"get"은 가능한 한 표준 API로 서명을 정리하는 별도의 실제 파일에 쓰는 것을 의미합니다.

미리 감사드립니다.

친절하게.

미르코

답변

3

싸여 서명

<yourxml> 
    ... 
    <Signature>....</Signature> 
</yourxml> 

서명은 XML 문서의 노드입니다. XML 서명을 확인한 후 노드를 찾아 DOM 구조를 제거하고 문서를 저장합니다. 당신은 동일한 기술을 적용 할 수

<Signature> 
    <Object Id="object"> 
     <yourxml>...</yourxml> 
    </Object> 
</Signature> 

// Instantiate the document to be signed. 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(xml)); 

// Find Signature element. 
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature"); 

//... XML Signature validation 

//remove signature node from DOM 
nl.item(0).getParentNode().removeChild(nl.item(0)); 

//write to file. 
OutputStream os = new FileOutputStream(outputFileName); 
TransformerFactory tf = TransformerFactory.newInstance(); 
Transformer trans = tf.newTransformer(); 
trans.transform(new DOMSource(doc), new StreamResult(os)); 

장막의 서명. Object 노드를 찾고 첫 번째 자식을 파일에 저장합니다. 그러나이 경우, XMLSignature 오브젝트 데이터는 XML 구조의 경우

포락 경우에 대한 @pedrofb 응답에서
//XMLSignature result of validation process 
XMLSignature signature = ... 

//Gets the node 
XMLObject xmlObject = (XMLObject)signature.getObjects().get(0); 
Node yourXmlNode = ((DOMStructure)xmlObject.getContent().get(0)).getNode(); 

//Save to file 
OutputStream os = new FileOutputStream(outputFileName); 
TransformerFactory tf = TransformerFactory.newInstance(); 
Transformer trans = tf.newTransformer(); 
trans.transform(new DOMSource(yourXmlNode), new StreamResult(os)); 
+0

많은 감사합니다. 우아한 솔루션. – Mirko

1

는, 코드가 작동하는 서명 객체를 얻을 수 getObjects 방법을 제공합니다. 그러나 나는 개체 노드에서 평면 데이터, 그래서 나는 유사한 기술을 사용하여 원래 데이터 내용을 구하십시오

NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Object"); 
if (nl.getLength() == 0) { 
    throw new Exception("*** Cannot find Object element"); 
} 
final String data = nl.item(0).getTextContent(); 

try { 
    File target = new File("/path/output.dat"); 

    FileWriter writer = new FileWriter(target); 
    BufferedWriter bufferedWriter = new BufferedWriter(writer, 8192); 
    bufferedWriter.write(data); 

    //flush & close writers 
    //... 

} catch (Exception e) { 
    //... 

}