我们在我们的Spring Security SAML应用程序中使用Spring Security SAML (v1.0.3)来实现带有IDP的SAML。
Requirement:仅接受来自IDP的签名SAML响应消息,如果未签名SAML响应,则抛出异常。
实际结果:即使SAML响应消息中完全缺少签名信息,它也被接受,Security库不会抛出异常。
观测:
requireLogoutRequestSigned和requireLogoutResponseSigned,这些属性控制注销请求和响应是否应该签名。wantAssertionSigned,它指示SP是否需要签名断言。问题
Spring Security SAML框架中是否有任何属性或方法可以使SP只接受来自IDP的签名登录响应(在消息级别)?wantAssertionSigned只启用签名断言,而不启用消息。发布于 2018-09-21 13:03:54
首先,确保使用了允许签名响应的正确绑定。例如,如果我正确理解所写的这里,第578-582行,则重定向绑定本身不应该有签名。
“必须删除SAML协议消息上的任何签名,包括XML元素本身。请注意,如果消息的内容包含另一个签名,如签名的SAML断言,则不会删除此嵌入签名。但是,这种消息在编码后的长度基本上排除了使用此机制。因此,包含签名内容的SAML协议消息不应使用此机制进行编码。”
对于HTTP绑定,它在我最近正在处理的一个项目中使用,在相同的(如上面)文档中的第839-842行中,它规定:“用户代理中介的存在意味着请求者和响应者不能依赖传输层来进行终端身份验证、完整性或机密保护,而必须对接收到的消息进行身份验证。SAML为这种情况提供协议消息的签名,用于身份验证和完整性。表单编码的消息可以在应用base64编码之前进行签名。”
基于此,我们决定强制执行由HTTP绑定处理的所有响应消息,必须进行签名。其他的装订都完好无损。
为了实现这一点,我对现有的spring的HTTPPostBinding进行了子类化。然后,我指示spring提供的SAMLProcessorImpl使用这个绑定而不是它的默认绑定。这个自定义绑定实现添加了一个额外的opensaml的SecurityPolicyRule。对于这个规则,非常简单的实现,强制所有SAML消息被签名。签名验证留给已经存在的opensaml的SAMLProtocolMessageXMLSignatureSecurityPolicyRule.默认情况下,这个签名包含在默认的HTTPPostBinding中,而且在默认情况下,允许缺少签名。如果您决定使用自己的安全策略规则实现,这可能是一个很好的起点。
至于断言签名,我认为默认实现也存在问题,但这可能超出了您的问题范围。
希望这能帮上忙干杯。
https://stackoverflow.com/questions/51754023
复制相似问题