2012-10-31 42 views
2

給定一個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

回答

0

我有類似的問題。這裏是Q & A。首先,參考屬性的格式應該是reference="#{insert id here}"。這應該會導致文檔簽名被驗證。然後移動/追加孩子的簽名到根元素,然後子簽名應該被驗證。

真相被告知,我遇到的問題是文檔沒有被簽名,但是有一個子元素,而且我無法驗證該簽名。至少還沒有。如果我明白這一點,我會更新。