2010-02-04 3 views
1

SOAP 문서에 시도하고 서명하는 데 xmlseclibs을 사용하고 있지만 서명 또는 유효성 검사 여부에 따라 같은 방식으로 표준화하지는 않습니다.올바른 XML 전용 정규화는 무엇입니까?

예를 들어 설명해 드리겠습니다. 이것은 내가 서명하는 것을 시도하고있는 XML입니다 :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Header/> 
<soapenv:Body> 
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" MajorVersion="1" MinorVersion="1" IssueInstant="2010-02-04T15:27:43Z" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a"> 
<samlp:Status> 
<samlp:StatusCode Value="samlp:Requester"/> 
</samlp:Status> 
</samlp:Response> 
</soapenv:Body> 
</soapenv:Envelope> 

내가 PHP에서 일하는 일부 코드는 공개 키와 개인 키 인증서의 조합을 사용하여 서명을 얻고, 그것을 작동하는 것 같았다. 그것은 모든 적절한 것들을 가진 <ds:Signature> 요소를 추가했으며, 멋지게 보였다. 그런 다음 xmlseclibs (및 공개 키 인증서)를 사용하여 다시 서명 한 후 즉시 유효성 검사를 시도하여 테스트했지만 유효성 검사에 실패했습니다. 그래서 똑같은 코드 라이브러리가 서명과 검증을하고 있지만, 두 프로세스는 어떤 이유로 동의하지 않습니다.

xmlseclibs에 디버깅 코드를 추가하여 수행중인 작업을 확인했습니다. 서명 키가 표시되는 이유와 유효성 검사 키가 다른 이유는 두 가지에서 다르게 표준화되기 때문입니다. 상황. 나는 <samlp:Response> 요소에 서명을 말할 때, 이것은 정규 형식은 (가독성을 위해 여기에 내가 추가 한 줄 바꿈) 서명 : 그것은 서명의 유효성을 검사 간다 그러나

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"> 
<samlp:Status> 
<samlp:StatusCode Value="samlp:Requester"> 
</samlp:StatusCode> 
</samlp:Status> 
</samlp:Response> 

, 이것은 정규형 그 것이다 (여기서 다시, 내가 추가 한 줄 바꿈)에 대한 유효성을 검사하는 계산 : 당신이 볼 수있는 바와 같이, 제 1하지 않는 동안

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a"> 
<samlp:Status> 
<samlp:StatusCode Value="samlp:Requester"> 
</samlp:StatusCode> 
</samlp:Status> 
</samlp:Response> 

그래서,이 버전은 <samlp:Response> 요소에서 xmlns:saml 속성을 생략합니다. (이것은 두 가지 모두에 포함되어있는 xmlns:samlp 속성과는 다릅니다.) 이것은 xmlseclibs의 버그와 매우 흡사하게 보입니다. 그렇지만 정식 양식이 올바른지 알고 있다면 해결할 수 있습니다. 하나. 독점적 인 정규화로 그 속성을 생략해야합니까? 아니면 포함시켜야합니까? 어느 것이 올바른 표준 형식입니까?

+0

이것은 버그처럼 보입니다. xmlseclibs의 문제 추적기에 게시해야합니다. –

답변

2

DOM 문서를 부적절하게 만들고 유효하지 않은 메모리 트리를 사용하려고합니다. 직렬화 된 결과를 직렬화하고 사용하거나 서명을 시도하기 전에 트리에서 네임 스페이스 선언을 올바르게 작성하십시오. 자세한 내용은 버그 보고서를 참조하십시오. http://code.google.com/p/xmlseclibs/issues/detail?id=6

3

정확한 정식 형식도 아닙니다.

네임 스페이스 노드는 속성 노드보다 작은 문서 순서 위치를 가지고 :

서명 된 XML은 문서 순서 규칙을 나누기 비 공간 속성 뒤에 오는 네임 스페이스 선언을 가지고 있습니다.

확인 XML에 saml 네임 스페이스 노드가 완전히 없습니다. 정규화는 네임 스페이스 노드를 참조하는 자식 콘텐츠가 없기 때문에 네임 스페이스 노드를 제거하지 않습니다. 중복 네임 스페이스 노드 (예 : 부모에서 이미 적용된 네임 스페이스) 만 제거합니다.

xmlseclibs가 왜 이런 일이 발생했는지에 대해 충분히 알지 못합니다. 그러나 두 가지 모두에 대해서는 분명히 잘못되었습니다.

<samlp:Response xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a"> 
<samlp:Status> 
<samlp:StatusCode Value="samlp:Requester"></samlp:StatusCode> 
</samlp:Status> 
</samlp:Response> 

ETA는 : 난 그냥 SVN에 xmlseclibs.php 보았고, 거기에 현재의 접근 방식 등이있는 쉬운 수정이 아니라 근본적으로 결함이 FWIW 내 DOM에 C14N 기능은 여기 말한다. "canonicalised"DOM을 생성 한 다음 평범한 old saveXML()으로 serialize합니다. saveXML이 약속하지 않는 속성 순서와 문자 이스케이프에 대한 C14N 직렬화 규칙이 있으므로이 방법이 가능하지 않을 수 있습니다.

+0

그런 다음 XML 서명을하는 다른 코드베이스를 알고 있습니까? 필연적으로 PHP 자체 일 필요는 없습니다. 그것은 COM 객체이거나 가능하게는 내가 인터페이스 할 수있는 다른 것일 수 있습니다. – SoaperGEM

+0

PHP (mine for Python)에 대해 모른다 ... DOMDocument에 대한 c14n 호환 serialiser 함수를 작성하는 것이 어렵지는 않을 것이다. 규칙은 실제로 복잡하지는 않다. (XML 직렬화는 파싱보다 훨씬 쉽습니다.) Windows의 경우 WWSAPI http://msdn.microsoft.com/en-us/library/dd430435%28VS.85%29.aspx가 있지만 이는 Win7 +에서만 기본적으로 설치됩니다. 명령 줄에는 XMLStarlet도 있습니다. – bobince

+0

@SoaperGEM PHP DOM 확장에는 c14n에 대한 (최근에 문서화되었지만 5.2.0 이후) 방법이 있습니다. http://www.php.net/manual/en/domnode.c14n.php – RelaXNow

관련 문제