使用或不使用断言签名来签署 SAML 响应?

Posted

技术标签:

【中文标题】使用或不使用断言签名来签署 SAML 响应?【英文标题】:Sign SAML Response with or without Assertion Signature? 【发布时间】:2011-10-21 02:42:06 【问题描述】:

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

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

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

C) 别的东西?

【问题讨论】:

【参考方案1】:

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

    SHA1 断言的规范版本。 使用 SHA1 签名生成 SignedInfo XML 片段 签署 SignedInfo XML 片段,再次采用规范形式 获取 SignedInfo、签名和密钥信息并创建签名 XML 片段 将此 SignatureXML 插入到断言中(应该在 saml:subject 之前) 现在将断言(包括签名)插入响应中 SHA1 此响应 使用 SHA1 签名生成 SignedInfo XML 片段 签署 SignedInfo XML 片段,再次采用规范形式 获取 SignedInfo、签名和密钥信息并创建签名 XML 片段 将此 SignatureXML 插入响应中 将 XML 版本信息添加到响应中。

就是这样。 SAML 非常糟糕。有很多小细节让实现 SAML 成为一场噩梦(比如计算 XML 子集(断言)的规范形式,也不包括 XML 文档的 XML 版本。

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

【讨论】:

使用 SHA1 签名生成 SignedInfo XML 片段 > 我认为这应该是“SHA1 哈希”?【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

正确答案是 B。

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

【讨论】:

以上是关于使用或不使用断言签名来签署 SAML 响应?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SAML 2.0 的自签名证书

使用自签名证书进行 Saml 2 断言

我是不是应该要求 IdP 签署 SAML2 SSO 响应?

Spring Security SAML - 无法验证签名

如何建立对中介颁发的 X.509 证书的信任?

OneLogin 签名的 Authnrequest HTTP 重定向方法