0

我们在我们的 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仅启用签名断言而不启用消息。
4

1 回答 1

1
  1. 我找不到这样的配置可能性,不得不添加自定义实现。我将在下面详细说明。
  2. 没错,这是两种不同的东西。

首先,确保使用允许签名响应的正确绑定。例如,重定向绑定不应该在响应本身中有签名,如果我正确理解这里写的内容,第 578-582 行

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

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

基于此,我们决定强制所有由 HTTP Post 绑定处理的响应消息都必须签名。我们将其他绑定保持不变。

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

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

希望这会有所帮助,干杯。

于 2018-09-21T13:03:54.230 回答