2013-10-19 423 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。