문제

이 XML 문서입니다. XML 서명을 사용하여 사용자 ID 파트 만 서명하고 싶습니다. 특정 요소를 선택하기 위해 XPath 변환을 사용하고 있습니다.

<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
.



문제는 무엇입니까?
편집

@ jörn Horstmann이 메시지가 그냥 로그 인 것입니다. 이제 문제는 XPath 쿼리를 제공 한 후에도 전체 문서가 사용자 ID 대신 서명됩니다. 문서에 서명 한 후 <testing>Element 값을 변경 하여이 문제를 확인했습니다. 결과는 문서가 검증되지 않음 (사용자 ID 부분에만 서명 된 경우, <testing>에 대한 변경 사항이 유효한 서명이 발생해야합니다.)

도움이 되었습니까?

해결책

이것은 유효한 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"))
.

편집 :

메시지는 오류가 아닙니다. 라인 426 여기 , 로그 수준은 아마도 정보보다 낮아야합니다.

나는 또한 XPath 필터링에 대한 설명을 살펴 봤습니다 :

XPath 매개 변수에 나타나는 XPath 표현식은 입력 노드 집합의 각 노드에 대해 한 번 평가됩니다. 결과는 부울로 변환됩니다. 부울이 true이면 노드가 출력 노드 집합에 포함됩니다. 부울이 false이면 노드가 출력 노드 집합에서 생략됩니다.

그래서 Signature의 UserID 만 포함하는 올바른 XPath 표현식은 self::UserID입니다. 그러나 이것이 실제로 XML 서명에 대해 의미가 있는지 묻지 마십시오. 사양의 예는 XPath 표현식을 사용하여 서명 요소 자체를 제외한 모든 것을 포함하는 것으로 보입니다.

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

편집 2 :

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top