如何使用 Spring Security SAML 扩展对 SAML 请求/响应进行签名

Oma*_*zam 3 spring-security x509certificate saml-2.0 xml-signature spring-saml

我能够使用 Spring Security SAML 扩展让我的应用程序充当具有IDP SSOCIRCLE的 SP。我的客户有以下要求:

1. 对断言进行签名:从 IDP 发送的断言已签名并且工作正常。

2. 对请求/响应进行签名:使用 SSO Circle 生成元数据文件时。我选择将AuthnRequestsSigned选项设置为true。我将 SP 元数据上传到 SSO Circle IDP。SP 元数据具有以下true值:AuthnRequestsSignedWantAssertionsSigned。运行应用程序时,我的请求和收到的响应都没有签名。

我在完成第二个要求时遇到问题。我对 SAML 和一般安全性还不熟悉。我在这里缺少什么?

更新

在考虑了弗拉基米尔的意见后。我将绑定更改为 HTTP-Post,因此现在我正在发送带有所示签名的 SAML 请求。我能够通过执行以下操作来发送使用我的私钥(不是示例项目提供的私钥)签名的请求:

  1. 使用 keygen 工具创建密钥库、CSR 和公钥证书。
  2. 更新我的 SP 元数据文件中的数字签名部分以获取新证书
  3. 从 IDP SSOCIRCLE 中删除旧的 SP 元数据文件并添加新的 SP 元数据文件
  4. 更改 spring 配置以使 JKSKeyManager 使用我使用新别名和密码创建的新密钥库。

我现在需要做的是让 IDP(SSOCIRCLE) 将响应发送到 a. 响应已签名 B. 断言已签署

如何才能做到这一点?鉴于响应的签名应该与断言的签名不同,我需要做哪些更改来处理这个问题。谢谢。

Vla*_*fer 5

HTTP 重定向绑定要求ds:Signature在发送消息之前删除 SAML 消息本身中存在的任何元素:

SAML 协议消息上的任何签名(包括 XML 元素本身)都必须删除。请注意,如果消息的内容包含其他签名(例如签名的 SAML 断言),则不会删除此嵌入的签名。然而,编码后这种消息的长度本质上妨碍了使用这种机制。因此,包含签名内容的 SAML 协议消息不应使用此机制进行编码。(saml2-bindings,578-582,从 PDF 复制粘贴)

同时,HTTP 重定向绑定要求将新的数字签名作为参数附加到 GET URL Signature

这意味着,使用 HTTP 重定向,您无法在消息级别发送带有签名的消息,而是将签名添加到 URL。因此,从 Spring SAML 发送到 IDP 的整个消息都经过签名(从 SP 发送的数据中检查)。

除了在断言中包含签名之外,没有标准方法可以强制 IDP 发送在消息级别签名的响应消息。如果您使用 SSL/TLS,则消息的真实性和不可否认性(数字签名的特征)由传输层提供。