这是 SAML 实施的常见问题。虽然在某些情况下,签名在协议级别是合法的可选,但在其他情况下它不是可选的......但不幸的是,实现允许这样做。
ruby-saml 实现了服务提供者 (SP) 方面。关于 SAML规范
服务提供者可以签署认证请求(AuthNRequest
)。该协议允许未签名的身份验证请求。此设置还通知AuthnRequestsSigned
库生成的 SAML 元数据中可选属性的值;该属性向身份提供者传达服务提供者是否要签署请求。最佳实践 - 签署请求。
服务提供商必须LogoutRequest
在前通道 SLO 中签署注销请求 ( )。如果允许此请求未签名,则该库违反了规范。从规范:
4.4.4.1 使用
请求者必须向响应者验证自己的身份,并通过对消息签名或使用特定于绑定的机制来确保消息的完整性。
虽然一些实现坚持认为 https 可以被认为是一种特定于绑定的机制,但服务器端 https 确实提供了传输中的消息完整性,但它肯定不会对请求者进行身份验证。签名是一个更强有力的保证,即请求者不是向身份提供者发送类似 DoS 的注销请求的随机第三方。
- 服务提供者必须
LogoutResponse
在前通道 SLO 中使用 POST/Redirect 绑定对注销响应 ( ) 进行签名。如果允许此响应未签名,则该库违反规范。从规范:
第 4.4.3.4 节<LogoutResponse>
对身份提供者的会话参与者/权限问题
<LogoutResponse>
如果使用 HTTP POST 或 Redirect 绑定,则必须对消息进行签名。
- 服务提供者希望在其从身份提供者处收到的响应上得到签名。响应消息的结构是这样的,即有一个包含 Assertion 元素的整体 Response 元素。规范要求响应或断言或响应和断言都已签名。
此设置还通知WantAssertionsSigned
库生成的 SAML 元数据中可选属性的值;除了规范要求的任何签名之外,此属性与身份提供者通信服务提供者是否希望对断言进行签名。许多商业身份提供者会同时签署断言和响应,但有些只会签署任何一个。
- SAML元数据规范建议对元数据进行签名。
第 3 节 - 签名处理
元数据实例中的各种元素都可以进行数字签名(如元素包含的<ds:Signature>
元素所示),具有以下好处:
并非总是需要数字签名,例如,如果依赖方通过安全渠道直接(没有中介)直接从发布实体获取信息,而该实体已通过数字签名以外的其他方式向依赖方进行了身份验证.
许多不同的技术可用于“直接”认证和两方之间的安全通道建立。该列表包括 TLS/SSL、HMAC、基于密码的机制等。此外,适用的安全要求取决于通信应用程序。此外,元素可以继承封闭父元素的签名,这些父元素本身已签名。
在没有这样的上下文的情况下,建议至少对元数据实例的根元素进行签名。
所以真正令人震惊的问题是允许 LogoutRequest 和 LogoutResponse 去签名。