我们在Java应用程序中将Spring Security SAML
(v1.0.3)用于具有IDP的SAML SSO。
要求:仅接受来自IDP的已签名SAML响应消息,如果未签名SAML响应,则引发异常。
实际结果:即使SAML登录响应消息中的签名信息完全丢失,该签名信息也会被接受并且Spring Security SAML库不会引发异常。
观察:
requireLogoutRequestSigned
和requireLogoutResponseSigned
,用于控制是否对注销请求和响应进行签名。wantAssertionSigned
,用于指示SP是否需要签名的断言。问题:
Spring Security SAML
框架中是否有任何属性或方法可以使SP仅接受来自IDP的已签名登录响应(在消息级别)?wantAssertionSigned
仅启用签名的断言,而不启用消息。答案 0 :(得分:1)
首先,请确保使用正确的绑定以允许签名响应。例如,如果我正确理解了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中包含此标记,并且默认情况下,也允许缺少签名。如果您决定采用自己的安全策略规则实施,这可能是一个很好的起点。
对于断言签名,我认为默认实现也存在问题,但这可能超出了您的问题范围。
希望这会有所帮助,欢呼起来。