如何验证 SAMLv2 响应是否来自 IdP?

How to validate whether SAMLv2 response is from IdP?

我正在构建一个使用 SAMLv2 对用户进行身份验证的应用程序。身份提供者认证成功后,响应返回到浏览器,然后发送到目标服务器。

修剪后的响应如下所示:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> <ds:Reference URI="#uuid-73c06e86-88d2-4204-91f4-3d484bc782cc"> <ds:Transforms> <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </ds:Transforms> <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <ds:DigestValue>H9ffPJ6/jq25p13BcziR0hNLkGg=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>FegjeGwQO..J7hpJEQ==</ds:SignatureValue> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate><!-- certificate data --></ds:X509Certificate> </ds:X509Data> <!-- more certificates --> </ds:KeyInfo> </ds:Signature>

我有 X509 证书序列 <ds:DigestValue /><ds:SignatureValue />。这两个字段包含什么?我应该如何验证响应是否由有效服务器返回?

签名是标准的XML signatures. This validation can for example be done in java using OpenSAML. Here is a blogpost说明了如何。

IDP 的"validity" 或信任是您必须在申请中确定的事情。如果签名有效,则意味着 SAML 消息是从具有相应私钥的 IDP 发送的。然后你必须决定你是否信任那个 IDP。