C#.NET中部分文档的Xml签名验证失败

C#.NET中部分文档的Xml签名验证失败,c#,xml,saml-2.0,xml-signature,signedxml,C#,Xml,Saml 2.0,Xml Signature,Signedxml,给定一个XML文档,其中根节点使用RSA+SHA2签名进行签名,其中包含一个XML元素,该元素再次使用RSA+SHA2单独签名,我发现: 根节点上的签名无效 子节点上的单独签名无效 当将已签名的子节点复制到新的XML文件中,并将xmlns:声明移动到该节点以维护名称空间范围时,我发现 签名有效 XML结构类似于。在现实生活中,XML是一个带符号的SAML2 ArtifactResolve元素,包含一个带符号的SAML2断言 <Root id="_1"> <ds:Si

给定一个XML文档,其中根节点使用RSA+SHA2签名进行签名,其中包含一个XML元素,该元素再次使用RSA+SHA2单独签名,我发现:

  • 根节点上的签名无效
  • 子节点上的单独签名无效
当将已签名的子节点复制到新的XML文件中,并将xmlns:声明移动到该节点以维护名称空间范围时,我发现

  • 签名有效
XML结构类似于。在现实生活中,XML是一个带符号的SAML2 ArtifactResolve元素,包含一个带符号的SAML2断言

<Root id="_1">
  <ds:Signature reference="_1" />
  <Child id="_2">
    <ds:Signature reference="_2" />
  </Child>
</Root>
我这里的主要问题是通过将节点复制到新的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,加载签名,验证

有人知道为什么会有这种行为吗?已经尝试在XmlDocument上使用PreserveWhitespace=true,但没有帮助

非常感谢


沃特

我也有类似的问题。这是我的建议。首先,引用属性的格式应为
reference=“#{insert id here}”
。这将导致文档签名生效。然后将子签名移动/附加到根元素,然后子签名应进行验证

说实话,我遇到了一个问题,文档没有签名,但是子元素有,我无法验证签名。至少现在还没有。如果我弄明白了,我会更新的

  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