문제

사용 중입니다 xmlseclibs 비누 문서에 서명하려고하지만 서명하거나 검증하는지 여부에 따라 같은 방식으로 정식화하는 것 같습니다.

나는 당신에게 예를 들여 줄게. 이것은 내가 서명하려는 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> 요소, 이것은 표준 형태의 IT 표시입니다 (가독성을 위해 Newlines를 추가했습니다) :

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

그러나 서명을 검증 할 때, 이것은 표준 형태가 검증하기 위해 계산되는 표준 형태입니다 (다시, 여기에 Newlines를 추가했습니다).

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

보시다시피,이 버전은 xmlns:saml .의 속성 <samlp:Response> 요소, 첫 번째는 그렇지 않습니다. (이것은 다릅니다 xmlns:samlp 둘 다에 포함 된 속성.) 이것은 xmlseclibs의 버그처럼 보이는 것처럼 보이지만 그럼에도 불구하고 어떤 표준 형태가 올바른지 알고 있다면 나 자신을 고치는 것이 기쁘다. 그 속성은 독점적 인 표준화에 의해 생략되어야합니까? 아니면 포함되어야합니까? 올바른 독점적 인 표준 형태는 무엇입니까?

도움이 되었습니까?

해결책

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

다른 팁

올바른 표준 형식도 아닙니다!

서명 XML에는 Non-Namespace 속성 이후에 오는 네임 스페이스 선언이있어 문서 주문 규칙을 중단합니다.

네임 스페이스 노드는 속성 노드보다 문서 주문 위치가 적습니다.

확인 XML이 누락되었습니다 saml 네임 스페이스 노드를 완전히합니다. CanonicalISATION은 자식 콘텐츠가 없기 때문에 네임 스페이스 노드를 제거하지 않습니다. 중복 네임 스페이스 노드 (예 : 이미 부모에게 적용된 네임 스페이스) 만 제거합니다.

XMLSeclibs에 대해 왜 이런 일이 일어나고 있는지 말할만큼 충분히 알지 못하지만 두 카운트에서는 확실히 잘못입니다. 내 DOM의 C14N 기능은 다음과 같이 말합니다.

<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 : 방금 봤어요 xmlseclibs.php SVN에서는 현재 접근 방식이 근본적으로 결함이 있기 때문에 이에 대한 쉬운 수정은 없습니다. 그것은 "정식화 된"돔을 만들고 평범한 오래된 것으로 연쇄하려고합니다. saveXML(). 속성 순서에 대한 C14N 직렬화 규칙이 있으므로 문자는 saveXML 따르겠다고 약속하지 않으며 이것이 작동 할 수있는 방법이 없습니다.

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