使用SAML响应时,是应该对Assertion进行签名还是不对其进行签名?

15

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

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

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

C) 其他操作?

4个回答

44

SAML很糟糕,每次我读到答案都几乎是正确的,这里是精简的正确算法:

  1. 对声明的规范版本进行SHA1处理。
  2. 使用SHA1签名生成一个SignedInfo XML片段
  3. 对SignedInfo XML片段进行签名,再次使用规范形式
  4. 将SignedInfo、Signature和密钥信息创建为Signature XML片段
  5. 将此SignatureXML插入Assertion中(应该放在saml:subject之前)
  6. 现在将Assertion(包括签名)插入到Response中
  7. SHA1处理此响应
  8. 使用SHA1签名生成一个SignedInfo XML片段
  9. 对SignedInfo XML片段进行签名,再次使用规范形式
  10. 将SignedInfo、Signature和密钥信息创建为Signature XML片段
  11. 将此SignatureXML插入响应中
  12. 向响应添加XML版本信息。

就是这样。SAML完全糟糕。有许多微小的细节使得实现SAML成为一场噩梦(例如计算XML的子集(声明)的规范形式),并且XML文档的XML版本不包括在内。

我完成了我的实现,希望永远不会再次经历这样的痛苦。


生成一个带有SHA1签名的SignedInfo XML片段。我猜这应该是“SHA1哈希”? - Duncan Jones

8
我相信正确答案是B)。首先签署Assertion,然后签署包含已签署Assertion数据的Response。但是,如果单个Issuer/Entity(STS/IDP等)同时签署两者,则没有真正必要签署Assertion,对吗?只需签署协议消息/响应即可,其中应包括Assertion数据。这将减少SP的处理要求。对于Web SSO,我只见过在不同实体签署Assertion与Response时才会同时签署两部分。

6
如果您要签署两者,那么断言必须先签名,然后是响应,因为响应的签名将基于整个响应内容(包括断言的签名)。 因此,第二次签署断言将使响应签名无效。

0

正确答案是B。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接