373.7. 서명된 요소의 Siblings로 XML 서명 분리
2.14.0 이후
서명이 서명된 요소의 형제인 분리된 서명을 만들 수 있습니다. 다음 예제에는 두 개의 분리된 서명이 포함되어 있습니다. 첫 번째 서명은 C 요소의이고 두 번째 서명은 요소 A 입니다. 서명은 중첩 되어 있습니다. 두 번째 서명은 첫 번째 서명을 포함하는 A 요소에 대한 것입니다.
분리된 XML 서명 예
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<A ID="IDforA">
<B>
<C ID="IDforC">
<D>dvalue</D>
</C>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
Id="_6bf13099-0568-4d76-8649-faf5dcb313c0">
<ds:SignedInfo>
<ds:CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<ds:SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#IDforC">
...
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>aUDFmiG71</ds:SignatureValue>
</ds:Signature>
</B>
</A>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"Id="_6b02fb8a-30df-42c6-ba25-76eba02c8214">
<ds:SignedInfo>
<ds:CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<ds:SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#IDforA">
...
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>q3tvRoGgc8cMUqUSzP6C21zb7tt04riPnDuk=</ds:SignatureValue>
</ds:Signature>
<root>
이 예제에서는 여러 요소에 서명하고 각 요소에 대해 서명이 형제로 생성되는 것을 보여줍니다. 서명할 요소에는 유형 ID의 특성이 있어야 합니다. 특성의 ID 유형은 XML 스키마에 정의해야 합니다(옵션 schemaResourceUri참조). 유형 ID의 속성을 가리키는 XPATH 표현식 목록을 지정합니다( xpathsToIdAttributes참조). 이러한 특성은 서명할 요소를 결정합니다. 요소는 keyAccessor 빈에서 제공하는 것과 동일한 키로 서명됩니다. 상위(예: 더 깊은) 계층 수준이 있는 요소는 먼저 서명됩니다. 예제에서 C 요소는 A 요소 이전에 서명됩니다.
Java DSL 예
from("direct:detached")
.to("xmlsecurity:sign://detached?keyAccessor=#keyAccessorBeant&xpathsToIdAttributes=#xpathsToIdAttributesBean&schemaResourceUri=Test.xsd")
.to("xmlsecurity:verify://detached?keySelector=#keySelectorBean&schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd")
.to("mock:result");Spring 예
<bean id="xpathsToIdAttributesBean" class="java.util.ArrayList">
<constructor-arg type="java.util.Collection">
<list>
<bean
class="org.apache.camel.component.xmlsecurity.api.XmlSignatureHelper"
factory-method="getXpathFilter">
<constructor-arg type="java.lang.String"
value="/ns:root/a/@ID" />
<constructor-arg>
<map key-type="java.lang.String" value-type="java.lang.String">
<entry key="ns" value="http://test" />
</map>
</constructor-arg>
</bean>
</list>
</constructor-arg>
</bean>
...
<from uri="direct:detached" />
<to
uri="xmlsecurity:sign://detached?keyAccessor=#keyAccessorBean&xpathsToIdAttributes=#xpathsToIdAttributesBean&schemaResourceUri=Test.xsd" />
<to
uri="xmlsecurity:verify://detached?keySelector=#keySelectorBean&schemaResourceUri=Test.xsd" />
<to uri="mock:result" />