2013-10-19 376 views
2

我們的IdP是Salesforce.com組織。 SP是第三方.Net應用程序。在開發過程中,第三方報告說他們無法驗證發送的SAML響應。SAML簽名驗證失敗

我們決定嘗試使用ComponentSpace驗證我們的結果,以驗證SAML響應。以下是我們嘗試過的:

// Load the certificate from the file: certInFile 
// Load the SAML in an XMLElement: samlXml 
// Retrieve the certificate from the SAML: certInSaml 

Console.WriteLine("SAML is valid ? " + SAMLResponse.IsValid(samlXml)); 
Console.WriteLine("Is SAML signed? " + SAMLMessageSignature.IsSigned(samlXml)); 
Console.WriteLine("Certificate found in SAML is same as certificate file? " + certInFile.Equals(certInSaml)); 
Console.WriteLine("Validated SAML with certificate found in SAML" + SAMLMessageSignature.Verify(samlXml, certInSaml)); 
Console.WriteLine("Validated SAML with certificate file" + SAMLMessageSignature.Verify(samlXml, certInFile)); 

我對上述所有內容都有效,除了最後兩個。所以:

  1. 的SAML有效
  2. 的SAML有一個有效的簽名
  3. 在SAML的公鑰證書是一樣的,我們
  4. 的SAML與私人簽訂的證書文件無論是證書文件,也沒有在SAML

發送從3,4公鑰密鑰才能得出結論,Salesforce的是簽署,但用不同的證書,但在發送響應錯誤的公鑰?

編輯:樣品SAML是這裏http://pastebin.com/J8FTxnhJ

我缺少什麼?

+0

您可以將完整的SAML消息粘貼到某處嗎? –

+0

@Stefan http://pastebin.com/J8FTxnhJ –

+0

這個問題解決了嗎?我正面臨類似的問題,即XML簽名驗證失敗。 IDP是Salesforce.com – mithrandir

回答

1

這工作時,我們沒有解碼base64編碼的SAML生成,但直接試圖驗證它。但是,仍然不確定爲什麼ComponentSpace方法對解碼字符串報告不同。

+0

你用什麼方法「直接嘗試驗證它」? SAMLMessageSignature.Verify()只接受一個XmlElement。 – friggle

+0

我也想知道這一點。一些在線服務非常好地驗證了我的base64編碼數據,但ComponentSpace工具包似乎只能驗證XmlElements。 – MLowijs

3

XML簽名驗證失敗的原因可能是XML簽名後已被修改,或者使用了錯誤的證書來驗證簽名。最可能的情況是使用了錯誤的證書。

Salesforce使用其私鑰簽署SAML響應。使用Salesforce管理控制檯,您可以下載應用於執行簽名驗證的相應公鑰/證書。

當致電SAMLMessageSignature.Verify時,您可以指定X509Certificate用於執行驗證,這通常是您應該執行的操作。

但是,base-64編碼的X.509證書也嵌入在XML簽名中。您可以使用此嵌入式證書來檢查簽名是否經過驗證。

爲此,請不要將X509Certificate傳遞到SAMLMessageSignature.Verify

例如:SAMLMessageSignature.Verify(samlXml, null);

如果這樣的作品,但指定的證書down't工作,那麼這證實正在使用錯誤的證書。

您可以撥打SAMLMessageSignature.GetCertificate從XML簽名中檢索X.509證書,以將其與正在使用的證書進行比較。

另外,作爲附註,XML簽名適用於XML。它們不能使用HTTP Post數據中發送的base-64編碼的SAML響應直接進行驗證。在嘗試驗證XML簽名之前,必須將發佈數據解碼爲XML。