问题描述
我对 SAML 响应 XML 中的 SignatureValue 有疑问。 在一些 SAML 教程中,我阅读了有关签名值的内容,其中我们需要在发送到 SP 时使用私钥对签名值进行加密。
我们真的需要在发送到 SP 之前在 IDP 端加密 SignatureValue 吗?
因为我在想 IDP 会将公钥发送给 SP,而 SP 将拥有私钥,通过该私钥可以在 SP 端验证负载是否存在任何完整性问题。
请需要您的宝贵建议。提前致谢。
<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/2001/04/xmldsig-more#rsa-sha256" />
<ds:Reference URI="#_SAML-11">
<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/2001/04/xmlenc#sha256" />
<ds:DigestValue>asdfsf2342sdfsaf1123132123sdfsafsafsdf</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>TkjljjlkljllTlkjlsjdljslakfjlsnfl2352nlkn2k3l5lknln2l35nlnlnl2k3nk5lknlkn23l5</ds:SignatureValue>
</ds:Signature>
解决方法
我们需要在发送到 SP 时使用私钥对 SignatureValue 进行加密
我从未听说过这样的事情,我想不出有什么商业 SAML 产品支持对签名进行加密(或解密)。我还要注意,规范中没有提到它。此外,我无法理解对 SignatureValue 进行加密有何帮助 - 对任何事情都有帮助。
作为 IdP,您需要妥善处理对 XML 的签名(这是 95% 的 DIYers 搞砸的领域),然后您需要向您的服务提供商提供适当的公钥,以便签名可以验证。
,IdP 应使用其私钥对 SAML 响应进行数字签名。它的公钥通常发布在 SP 应该拥有的 SAML2 元数据中。然后,SP 可以验证来自 IdP 的 SAML 响应上的签名。如果 IdP 和 SP 之间发生任何更改,则签名将无法验证。
此外,某些 SP 要求 IdP 对属性进行加密,在这种情况下,它们将位于 EncryptedAssertion
节点中。
您可以在 SAML examples 中看到这些。
,我有通过 SAML 与大约 6 家供应商(也称为服务提供商)进行集成的经验。而且我想指出的是,某些服务提供商可能会避免特定步骤并且不需要签名或加密。例如,他们可能可以同时签署 Assertion 和 SAMLResponse,但没有 Assertion 加密。或者其他方式。 我已经发布了更多详细信息 here 和一些 C# code on GitHub,它们可能会帮助您弄清楚如何执行某些步骤。如果有帮助,请告诉我。