我能够使用 Spring Security SAML 扩展让我的应用程序充当具有 IDP SSOCIRCLE 的 SP。我的客户有以下要求:
1。对断言进行签名: 从 IDP 发送的断言已签名并且工作正常。
2。对请求/响应进行签名: 使用 SSO Circle 生成元数据文件时。我将选项 AuthnRequestsSigned 选择为 true。我将 SP 元数据上传到 SSO Circle IDP。 SP 元数据具有以下值为 true:AuthnRequestsSigned 和 WantAssertionsSigned。运行应用程序时,我的请求和我收到的响应都没有签名。
我在完成第二个要求时遇到问题。我对 SAML 和一般安全性还不熟悉。我在这里缺少什么?
更新
考虑了弗拉基米尔的意见后。我将绑定更改为 HTTP-Post,因此现在我正在发送带有所示签名的 SAML 请求。 我可以通过执行以下操作来发送使用我的私钥(不是示例项目提供的私钥)签名的请求:
我现在需要做的是让 IDP(SSOCIRCLE) 将响应发送到 一个。回复已签名 b.断言已签署
如何实现这一点?考虑到这一点,我需要做哪些改变来处理这个问题 响应的签名应该与断言的签名不同。 谢谢。
HTTP 重定向绑定要求在发送消息之前删除 SAML 消息本身中存在的任何
<ds:Signature>
元素:
saml-bindings-2.0-os
,第578-582行:
SAML 协议消息上的任何签名,包括
XML 元素本身,必须被删除。请注意,如果消息内容 包括另一个签名,例如签名的 SAML 断言,这 嵌入的签名不会被删除。然而,这样的消息的长度 编码后基本上排除了使用这种机制。因此 包含签名内容的 SAML 协议消息不应 使用这种机制进行编码。<ds:Signature>
同时,HTTP 重定向绑定要求将新的数字签名作为参数附加到 GET URL
Signature
。
saml-bindings-2.0-os
,第608-609行:
签名值必须使用base64编码(参见RFC 2045 [RFC2045])进行编码 删除所有空格,并作为名为
的查询字符串参数包含在内。Signature
这意味着使用 HTTP 重定向,您无法在消息级别发送带有签名的消息,而是将签名添加到 URL。因此,从 Spring SAML 发送到 IDP 的整个消息都经过签名(从 SP 发送的数据中检查)。
除了在断言中包含签名之外,没有标准方法可以强制 IDP 发送在消息级别签名的响应消息。如果您使用 SSL/TLS,则消息的真实性和不可否认性(数字签名的特征)由传输层提供。