2012-10-31 3 views
2

루트 노드가 RSA + SHA2 서명으로 서명 된 XML 문서에서 RSA + SHA2를 사용하여 다시 서명 된 XML 요소가 포함 된 경우 :C# .NET에서 문서 부분의 Xml 서명 유효성 검사가 실패합니다.

  • 루트 노드의 서명이 유효
  • 자식 노드의 별도의 서명이 유효

도의 xmlns를 이동, 새로운 XML 파일로 서명 된 자식 노드를 복사 : 네임 스페이스 범위를 유지하기 위해 해당 노드에 대한 선언

  • 서명이

XML 구조가 같은 것입니다 유효 함을 찾을 수 있습니다. 실생활에서 XML은 서명 된 SAML2 어설 션을 포함하는 서명 된 SAML2 ArtifactResolve 요소입니다.

이 모든 것을 확인하는 데 사용되는 코드는 매우 간단합니다. SignedXml 클래스.

SignedXml signedDocument = new SignedXml(document.DocumentElement); 
    signedDocument.LoadXml(GetSignatureElement(document.DocumentElement)); 
    Console.WriteLine("Document valid: {0}", 
    signedDocument.CheckSignature(cert, true)); // returns false 

여기에서 가장 중요한 문제는 노드를 새로운 XML 파일에 복사하여 유효성을 검사 할 수 있다는 것입니다. XPath를 통해 해당 노드를 쿼리하고이를 SignedXml에로드하면 실패합니다.

XmlElement element = (XmlElement)document.SelectSingleNode("//Child"); 
    SignedXml signedDocument = new SignedXml(element); 
    signedDocument.LoadXml(GetSignatureElement(element)); 
    Console.WriteLine("Element valid: {0}", 
    signedDocument.CheckSignature(cert, true)); // returns false 

지금은 헤이, 최대 서투른 솜씨 할 수 SignedXml의 설정의 톤이 있었지만, 그 정도가 아닌 경우. XML을로드하고 서명을로드 한 다음 유효성을 검사합니다.

누구나이 행동이 왜 그런지 실마리가 있습니다. PreserveWhitespace = true XmlDocument 사용하여 이미 시도했지만 도움이되지 않았다.

많은 감사를드립니다!

wouter

답변

0

나는 비슷한 문제가있었습니다. 다음은 Q & A입니다. 먼저 참조 속성은 reference="#{insert id here}" 형식이어야합니다. 그렇게하면 문서 서명이 유효성을 검사해야합니다. 그런 다음 하위 요소의 서명을 루트 요소로 이동/추가하면 하위 서명이 유효성을 검사해야합니다.

사실, 문서에 서명되지 않았지만 하위 요소에 문제가있어 서명을 확인할 수 없습니다. 아직은 아니야. 나는 그것을 알아 내면 갱신 할 것이다.