2012-05-22 8 views
-1

이것은 내 XML 문서입니다. XML 서명을 사용하여 userID 부분에만 서명하려고합니다. 해당 특정 요소를 선택하려면 xpath 변환을 사용하고 있습니다.Xpath 변환이 Java에서 작동하지 않습니다.

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
Version="2.0" IssueInstant="2012-05-22T13:40:52:390" ProtocolBinding="urn:oasis:na 
mes:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="localhos 
t:8080/consumer.jsp"> 
<UserID> 
    xyz 
</UserID> 
<testing> 
    text 
</testing> 
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"> 
    http://localhost:8080/saml/SProvider.jsp 
</saml:Issuer> 
</samlp:AuthnRequest> 


나는 변환 추가하려면 다음 코드를 사용하고 있습니다 :

transformList.add(exc14nTransform); 
transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\""))); 


을하지만 다음 얻을 :

Original Exception was javax.xml.transform.TransformerException: Extra illegal t 
okens: 'xmlns', ':', 'samlp', '=', '"urn:oasis:names:tc:SAML:2.0:protocol"' 


을 그래서, 제거 시도 xmlns 부분.

transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID"))); 


그러나 전체 문서를 서명하고 다음과 같은 메시지 제공 :

com.sun.org.apache.xml.internal.security.utils.CachedXPa 
thFuncHereAPI fixupFunctionTable 
INFO: Registering Here function 


문제가 무엇입니까?
EDIT
@ Jörn Horstmann은 메시지가 단지 로그 일 뿐이라고 말했다. 이제 문제는 xpath 쿼리를 제공 한 후에도 전체 문서가 UserID 대신 서명된다는 것입니다. 문서에 서명 한 후 <testing> 요소의 값을 변경하여이를 확인했습니다. 그 결과 문서가 유효화되지 않습니다 (UserID 부분에만 서명 한 경우 <testing>에 대한 변경 사항은 유효한 서명이되어야 함).

답변

3

이것은 유효한 xpath 표현식이 아니며 유효한 xpath 표현식이 아닙니다. 표현식 안에 네임 스페이스 접두어를 선언하십시오.

samlp:AuthnRequest/UserID xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 

XPathFilterParameterSpec 네임 스페이스 접두사의 매핑을 지정할 수 있습니다 또 다른 생성자를 가지고, 다음과 같은 표현을 시도 할 수 :

new XPathFilterParameterSpec("samlp:AuthnRequest/UserID", 
    Collections.singletonMap("samlp", "urn:oasis:names:tc:SAML:2.0:protocol")) 

편집 : 메시지가

하지 않는 것 오류가 발생하면 line 426 here을 참조하십시오. 로그 레벨은 INFO보다 낮을 수 있습니다.

I은 ​​또한 description of xpath filtering 살펴 가졌다 :

는 XPath 변수에 나타나는 XPath식이 입력 노드 세트의 각 노드에 대해 한번 계산된다. 결과는 부울로 변환됩니다. 부울이 참이면 노드는 출력 노드 집합에 포함됩니다. 부울이 거짓이면 노드는 출력 노드 집합에서 생략됩니다.

따라서 UserID 만 포함하는 올바른 xpath 표현식은 self::UserID이됩니다. 그러나 xml 서명에 실제로 이것이 의미가 있는지 물어 보지 마십시오.사양의 예는 서명 요소 자체를 제외한 모든 포함하는 XPath 식을 사용하는 것 같다

not(ancestor-or-self::dsig:Signature) 

편집 2 :

올바른 표현은 실제로 ancestor-or-self::UserID입니다 필터도 포함해야하기 때문에 UserID 노드의 텍스트 하위 노드.

+0

응답 해 주셔서 감사합니다. 나는 그것을 시도했다. 잘못된 토큰 오류가 발생했습니다. 하지만 이제는 문서에 서명 한 후 userID 값을 변경 한 다음이 변경된 문서의 유효성 검사를 시도했습니다. 그것은 완벽하게 검증됩니다 (발생해서는 안됩니다). 그리고 나는 여전히 메시지를 듣고있다 : com.sun.org.apache.xml.internal.security.utils.CachedXPa thFuncHereAPI fixupFunctionTable INFO : 여기에 등록하기 function – Ashwin

+0

"samlp : AuthnRequest/self :: UserID"와 "samlp" : AuthnRequest // self :: UserID "를 참조하십시오. 그래도 전체 문서에 서명합니다. – Ashwin

+0

수정 사항을 참조하십시오. – Ashwin

관련 문제