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

时间:2018-08-08 19:09:31

标签: java spring-security saml-2.0 spring-saml spring-security-saml2

我们在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 个答案:

答案 0 :(得分:1)

  1. 我找不到这种配置的可能性,不得不添加自定义实现。我将详细说明。
  2. 是的,那是两回事。

首先,请确保使用正确的绑定以允许签名响应。例如,如果我正确理解了here, lines 578-582

的内容,则重定向绑定不应在响应本身中具有签名。

” SAML协议消息上的任何签名,包括XML元素本身, 必须删除。请注意,如果邮件的内容包含另一个签名,例如 签名的SAML断言,不会删除此嵌入式签名。但是,这样的长度 编码后的消息实质上排除了使用此机制的可能性。因此SAML协议 包含签名内容的邮件不应使用此机制进行编码。”

关于HTTP Post绑定,该绑定是我最近正在研究的项目中使用的,在同一(如上)文档中,第839-842行指出: “用户代理中介的存在意味着请求者和响应者不能依赖于 传输层进行终端身份验证,完整性或机密性保护,并且必须对 而是收到了消息。 SAML在协议消息上提供签名以进行身份​​验证和 这种情况的完整性。格式编码的消息可以在应用base64编码之前签名。”

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

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

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

希望这会有所帮助,欢呼起来。

相关问题