C#.NET中部分文档的Xml签名验证失败
给定一个XML文档,其中根节点使用RSA+SHA2签名进行签名,其中包含一个XML元素,该元素再次使用RSA+SHA2单独签名,我发现: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
- 根节点上的签名无效
- 子节点上的单独签名无效
- 签名有效
<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