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

Java Spring Security SAML:仅接受来自IDP的签名SAML响应消息,java,spring-security,saml-2.0,spring-saml,spring-security-saml2,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库不会引发异常 观察结果: 如果SAML登录响应消息中存在错误的签名信息,那么它将抛出一个正确的异常 对于注销消息,我们在扩展元数据生成器中有属性requireLogoutRequest

我们在Java应用程序中使用
Spring Security SAML
(v1.0.3),用于带IDP的SAML SSO

要求:仅接受来自IDP的已签名SAML响应消息,如果SAML响应未签名,则引发异常

实际结果:即使SAML登录响应消息中完全缺少签名信息,它也会被接受,并且Spring Security SAML库不会引发异常

观察结果

  • 如果SAML登录响应消息中存在错误的签名信息,那么它将抛出一个正确的异常
  • 对于注销消息,我们在扩展元数据生成器中有属性
    requireLogoutRequestSigned
    requirelogoutresponsedesigned
    ,用于控制是否对注销请求和响应进行签名
  • 对于登录响应消息,我们有一个属性
    wantasertionsigned
    ,它指示SP是否需要签名断言
  • 问题

  • Spring-Security-SAML
    框架中是否有任何属性或方法允许SP仅接受来自IDP的签名登录响应(在消息级别)
  • 根据我的理解,SAML响应消息的签名和断言是两件不同的事情。对吗?属性
    WANTASERTIONSIGNED
    仅启用已签名的断言,而不启用消息
  • 我找不到这种配置的可能性,只好添加自定义实现。我将详细阐述以下内容
  • 这是正确的,这是两件不同的事情
  • 首先,确保使用了允许签名响应的适当绑定。例如,如果我正确理解了所写内容,重定向绑定不应该在响应本身中有签名

    “SAML协议消息上的任何签名,包括XML元素本身, 必须删除。请注意,如果邮件内容包含其他签名,例如 已签名的SAML断言,此嵌入签名不会被删除。但是,此签名的长度 编码后的消息本质上排除了使用这种机制 不应使用此机制对包含签名内容的邮件进行编码。”

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

    基于此,我们决定强制HTTP Post绑定处理的所有响应消息都必须签名。我们没有损坏其他的绑定

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

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

    希望这有帮助,干杯