gpt4 book ai didi

java - Spring 安全 SAML : Accept only signed SAML response messages from IDP

转载 作者:行者123 更新时间:2023-12-02 10:55:54 24 4
gpt4 key购买 nike

我们在 Java 应用程序中使用 Spring Security SAML (v1.0.3) 来通过 IDP 实现 SAML SSO。

要求:仅接受来自 IDP 的签名 SAML 响应消息,如果 SAML 响应未签名,则抛出异常。

实际结果:即使 SAML 登录响应消息中完全缺少签名信息,它也会被接受,并且 Spring Security SAML 库不会引发异常。

观察结果:

  1. 如果 SAML 登录响应消息中存在错误的签名信息,则会引发正确的异常。
  2. 对于注销消息,我们在扩展元数据生成器中具有 requireLogoutRequestSignedrequireLogoutResponseSigned 属性,用于控制是否对注销请求和响应进行签名。
  3. 对于登录响应消息,我们有一个属性wantAssertionSigned,用于指示 SP 是否需要签名断言。

问题:

  1. Spring Security SAML 框架中是否有任何属性或方法使 SP 只能接受来自 IDP 的签名登录响应(在消息级别)?
  2. 根据我的理解,SAML 响应消息的签名和断言是两件不同的事情。这是对的吗?属性 wantAssertionSigned 仅启用签名断言,而不启用消息。

最佳答案

  1. 我找不到这样的配置可能性,必须添加自定义实现。下面我会详细阐述。
  2. 这是正确的,这是两个不同的事情。

首先,确保使用正确的绑定(bind)来允许签名响应。例如,如果我正确理解所写的内容,重定向绑定(bind)不应在响应本身中具有签名 here, lines 578-582

“SAML 协议(protocol)消息上的任何签名,包括 XML 元素本身,必须删除。请注意,如果消息内容包含其他签名,例如签名的 SAML 断言,此嵌入签名不会被删除。然而,这样的长度编码后的消息本质上排除了使用这种机制。因此SAML协议(protocol)包含签名内容的消息不应使用此机制进行编码。”

至于我最近从事的一个项目中使用的 HTTP Post 绑定(bind),在同一个(如上所述)文档的第 839-842 行中指出:“用户代理中介的存在意味着请求者和响应者不能依赖传输层用于端到端身份验证、完整性或 secret 性保护,并且必须对而是收到消息。 SAML 为协议(protocol)消息提供签名以进行身份​​验证和此类案件的诚信度。表单编码消息可以在应用 Base64 编码之前进行签名。”

基于此,我们决定强制所有由 HTTP Post 绑定(bind)处理的响应消息都必须进行签名。我们保留其他绑定(bind)完好无损。

为了实现这一点,我对现有 spring 的 HTTPPostBinding 进行了子类化。然后,我指示 spring 提供的 SAMLProcessorImpl 使用此绑定(bind)而不是默认绑定(bind)。此自定义绑定(bind)实现添加了一个额外的 opensaml 的 SecurityPolicyRule。至于该规则,实现非常简单,强制对所有 SAML 消息进行签名。签名验证留给已经存在的 opensaml 的 SAMLProtocolMessageXMLSignatureSecurityPolicyRule。默认情况下,此选项包含在默认的 HTTPPostBinding 中,并且默认情况下也允许缺少签名。如果您决定实现自己的安全策略规则,这可能是一个很好的起点。

至于断言签名,我认为默认实现也存在问题,但这可能超出了您的问题范围。

希望这有帮助,干杯。

关于java - Spring 安全 SAML : Accept only signed SAML response messages from IDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51754023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com