給定一個XML文檔,其中根節點使用RSA + SHA2簽名進行簽名,該簽名包含一個使用RSA + SHA2再次單獨簽名的XML元素,我發現:Xml簽名驗證部分文檔在C#.NET中失敗
- 根節點上的簽名是無效
- 子節點上的獨立的簽名無效
當複製簽名的子節點插入一個新的XML文件,也是移動的xmlns:對該節點的聲明以及維護名稱空間範圍I發現
- 的簽名有效
的XML結構是一樣的東西。在現實生活中,XML是一個簽名的SAML2 ArtifactResolve元素,包含簽名的SAML2聲明。
<Root id="_1">
<ds:Signature reference="_1" />
<Child id="_2">
<ds:Signature reference="_2" />
</Child>
</Root>
用於驗證所有這些的代碼非常簡單,即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,加載簽名,驗證。
任何人有任何線索爲什麼這種行爲是這樣的?已經嘗試在XmlDocument上使用PreserveWhitespace = true,但這沒有幫助。
非常感謝!
Wouter