我们在Java应用程序中使用 Spring Security SAML
(v1.0.3)进行带IDP的SAML SSO .
Requirement :仅接受来自IDP的已签名SAML响应消息,如果SAML响应未签名,则抛出异常 .
Actual Result :即使SAML登录响应消息中完全缺少签名信息,它也会被接受,并且Spring Security SAML库不会抛出异常 .
Observations :
-
如果SAML登录响应消息中存在错误的签名信息,则会抛出正确的异常 .
-
对于Logout消息,扩展元数据生成器中的属性
requireLogoutRequestSigned
和requireLogoutResponseSigned
控制是否签名注销请求和响应 . -
对于登录响应消息,我们有一个属性
wantAssertionSigned
,指示SP是否需要签名断言 .
Questions :
-
Spring Security SAML
框架中是否有任何属性或方法使SP只能接受来自IDP的签名登录响应(在消息级别)? -
根据我的理解,签署SAML响应消息和断言是两回事 . 这是对的吗?属性
wantAssertionSigned
仅启用已签名的断言而不是消息 .
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的SAMLProtocolMessageXMLSignatureSecurityPolicyRule . 默认情况下,此默认值包含在默认HTTPPostBinding中,并且默认情况下也允许丢失签名 . 如果您决定使用自己的安全策略规则实现,这可能是一个很好的起点 .
至于断言签名,我认为默认实现也存在问题,但这可能超出了您的问题范围 .
希望这会有所帮助,欢呼 .