루트 노드가 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