我们在 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
仅启用签名断言,而不启用消息。首先,确保使用正确的绑定来允许签名响应。
例如,如果我正确理解 saml-bindings-2.0-os.pdf 第 578-582 行中所写内容,重定向绑定 不应在响应本身中包含签名。
至于我最近从事的一个项目中使用的SAML 协议消息上的任何签名,包括
<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
中,并且默认情况下也允许缺少签名。如果您决定实施自己的安全策略规则,这可能是一个很好的起点。至于断言签名,我认为默认实现也存在问题,但这可能超出了您的问题范围。
希望这有帮助,干杯。