Spring Security SAML:仅接受来自 IDP 的签名 SAML 响应消息

问题描述 投票:0回答:1

我们在 Java 应用程序中使用

Spring Security SAML
(v1.0.3) 通过 IDP 实现 SAML SSO。

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

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

观察

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

问题

  • Q1:
    Spring Security SAML
    框架中是否有任何属性或方法使 SP 只能接受来自 IDP 的签名登录响应(在消息级别)?
  • Q2: 根据我的理解,SAML 响应消息的签名和断言是两个不同的事情。正确吗?属性
    wantAssertionSigned
    仅启用签名断言,而不启用消息。
java spring-security saml-2.0 spring-saml spring-security-saml2
1个回答
3
投票
  1. 我找不到这样的配置可能性,不得不添加自定义实现。下面我会详细说明。
  2. 是的,这是两个不同的事情。

首先,确保使用正确的绑定来允许签名响应。

例如,如果我正确理解 saml-bindings-2.0-os.pdf 第 578-582 行中所写内容,重定向绑定 不应在响应本身中包含签名。

    SAML 协议消息上的任何签名,包括
  1. <ds:Signature>
     XML 元素本身,
    必须删除。请注意,如果消息的内容包含其他签名,例如
    签名的 SAML 断言,此嵌入签名不会被删除。然而,这样的长度
    编码后的消息本质上排除了使用这种机制。因此SAML协议
    包含签名内容的消息不应使用此机制进行编码。”
至于我最近从事的一个项目中使用的

HTTP Post 绑定,在同一个(如上所述)文档saml-bindings-2.0-os.pdf,第839-842行中指出:

用户代理中介的存在意味着请求者和响应者不能依赖 传输层用于端到端身份验证、完整性或机密性保护,并且必须对 而是收到消息。 SAML 在协议消息上提供签名以进行身份验证和 此类案件的诚信度。表单编码消息可以在应用 Base64 编码之前进行签名。

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

为了实现这一目标,我对现有 spring 的

HTTPPostBinding

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

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

希望这有帮助,干杯。

© www.soinside.com 2019 - 2024. All rights reserved.