15

在签署同样具有已签名断言的 SAML 响应时,我应该:

A) 生成没有断言签名的响应签名。然后在生成两个签名后注入断言签名。

B)生成断言签名并在生成响应签名时包含它。

C) 别的?

4

4 回答 4

43

SAML 很糟糕,每次我阅读答案时,它们几乎都是正确的,这是正确的算法:

  1. SHA1 断言的规范版本。
  2. 生成带有 SHA1 签名的 SignedInfo XML 片段
  3. 签署 SignedInfo XML 片段,再次使用规范形式
  4. 获取 SignedInfo、签名和密钥信息并创建签名 XML 片段
  5. 将此 SignatureXML 插入到断言中(应该在 saml:subject 之前)
  6. 现在获取断言(包括签名)并将其插入到响应中
  7. SHA1 这个回复
  8. 生成带有 SHA1 签名的 SignedInfo XML 片段
  9. 签署 SignedInfo XML 片段,再次使用规范形式
  10. 获取 SignedInfo、签名和密钥信息并创建签名 XML 片段
  11. 将此 SignatureXML 插入到响应中
  12. 将 XML 版本信息添加到响应中。

而已。SAML 非常糟糕。有大量的细微之处使实现 SAML 成为一场噩梦(比如计算 XML 子集的规范形式(断言),也不包括 XML 文档的 XML 版本。

我完成了我的实施,我希望再也不要重温这种痛苦。

于 2011-08-16T04:54:27.813 回答
8

我相信正确的答案是 B)。首先对 Assertion 进行签名,然后对包含已签名 Assertion 数据的 Response 进行签名。但是,如果一个发行人/实体(STS/IDP/etc)同时签署两者,就没有真正的理由签署断言吗?只需签署应包含断言数据的协议消息/响应。这将减少 SP 的处理要求。对于 Web SSO,我只看到当您有不同的实体对断言和响应进行签名时,这两个部分都已签名。

于 2011-08-05T21:06:48.380 回答
6

如果您要同时签署两者,则必须首先签署断言,然后是响应,因为响应签名将基于响应的全部内容(包括断言签名)。因此,第二次签署断言将使响应签名无效。

于 2011-08-07T16:50:49.020 回答
0

正确答案是 B。

如果断言方使用 A 对 SAML 响应进行签名,则依赖方必须在验证 SAML 响应之前删除 SAML 响应的签名和 SAML 断言的签名。SAML 核心规范规定不得使用除封装签名变换或排他规范化变换之外的变换生成签名。这两种转换都不能删除 SAML 断言的签名。因此,依赖方无法验证 SAML 响应。

于 2013-03-09T13:01:57.420 回答