我对SAML响应XML中的SignatureValue有疑问。在一些SAML教程中,我读过Signature Value,其中我们需要在发送到SP时使用私钥加密SignatureValue。
在发送到SP之前,我们真的需要在IDP加密SignatureValue吗?
因为我在想,IDP将向SP发送PublicKey,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%的DIY者搞砸的领域),然后您需要为您的服务提供商提供适当的公钥,以便验证签名。
IdP应该使用其私钥对SAML响应进行数字签名。它的公钥通常以SP应该拥有的SAML2元数据发布。然后SP可以验证来自IdP的SAML响应上的签名。如果IdP和SP之间发生了任何变化,签名将无法验证。
此外,一些SP需要IdP加密属性,在这种情况下,它们将位于EncryptedAssertion
节点中。
您可以在SAML示例中看到这些。
我有通过SAML与大约6个供应商(又名服务提供商)集成的经验。我想指出,一些服务提供商可能会避免特定的步骤,不需要签名或加密。例如,他们可能可以同时签署Assertion和SAMLResponse,但不需要Assertion加密。或者其他方式。我在这里发布了一些更多的细节,以及GitHub上的一些C#代码,这些代码可能会帮助您弄清楚如何执行某些步骤。如果有帮助,请告诉我。