在 SAML 响应 XML 中生成签名值的步骤

问题描述

我对 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,它们可能会帮助您弄清楚如何执行某些步骤。如果有帮助,请告诉我。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...