我在哪里可以找到有关 SP 如何使用其私钥签署身份验证请求并将其发送到 IdP 的 URL 的信息?
Posted
技术标签:
【中文标题】我在哪里可以找到有关 SP 如何使用其私钥签署身份验证请求并将其发送到 IdP 的 URL 的信息?【英文标题】:Where do I find info on how does SP use its private key to sign the authentication request and sends it to the URL at the IdP? 【发布时间】:2022-01-13 00:47:45 【问题描述】:我最近一直在读一本关于 SAML 2.0 的书。关于“SAML 元数据的典型用途和有用性”有一点说明如下:
SP 想要对用户进行身份验证。它查看元数据并在 IdP 上找到应发送用户的 URL。它使用其私钥对身份验证请求进行签名,并将其发送到 IdP 的 URL。
我最感兴趣的一行(也是我还不太了解的一行……)是:
它使用其私钥对身份验证请求进行签名并将其发送到 IdP 处的 URL。
我的问题是 - 在任何现有的标准/RFC/类似文档中,我可以找到关于 SAML 书中提到的这些确切点的信息 - 签名、调用?
例如,我不清楚这是由标准 HTTPS 进程签名的调用,还是特定于 SAML 的签名 + HTTPS,签名时使用什么类型的算法,应该发生什么样的调用( GET,POST,其他),应该与调用一起发送什么样的参数(如果这很重要)......以及与签名和发送相关的类似问题。我希望某种文件能够更详细地说明签名和调用程序。在正确的文档中找到精确的页面还没有多大成功。似乎 RFC 2818 可能是一个很好的方向,或者是许多 SAML 2.0 规范之一,或者其他。
指向包含签名和调用信息的正确文档的(部分)将不胜感激。对我不理解的给定报价进行详细说明也会受益匪浅。
【问题讨论】:
【参考方案1】:您有很多问题 - SAML 是一个很大的话题,这并不奇怪。而且有很多文件。请查看以下链接,因为它将引导某人将 perl 的 Net::SAML2 集成到 Web 应用程序中并逐步完成。
https://github.com/perl-net-saml2/perl-Net-SAML2/blob/master/TUTORIAL.md
但它确实掩盖了一些事情。早期它说:
IdP 对象包含从元数据中解析出来的身份提供者设置,然后用于其余调用。
你看到了一个
'sso_urls' =>
'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST' => 'https://accounts.google.com/o/saml2/idp?idpid=CXXXXXXXX',
'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect' => 'https://accounts.google.com/o/saml2/idp?idpid=CXXXXXXXX'
,
如果您忽略元数据https://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf 上的 40 多页文档,这是 IdP 用于登录并指定 HTTP 重定向和 POST 方法的两种方法。在这种情况下,URL 匹配,但它们不需要。
单独为 AuthnRequest 创建 HTTP 重定向是一个小壮举。 https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf。第 15 页 3.4 HTTP 重定向绑定描述了该方法。它本质上是采用 XML AuthnRequest 并使用 DEFLATE 压缩方法(请参阅 [RFC1951])结果经过 Base64 编码并分配给 SAMLResponse,并附加了 RelayState(如果有)和 SigAlg 作为 GET 请求参数。结果使用公认的算法(如 rsa-sha256)进行签名,并将 base 64 签名添加到查询参数中,这些参数通常是 URL 编码以通过浏览器请求。见https://github.com/perl-net-saml2/perl-Net-SAML2/blob/064f718178c3fa6edfe0b262fe4b5e4c8705411b/lib/Net/SAML2/Binding/Redirect.pm#L117
因此,学习它是遍历整个过程的每个部分。有多个文档涉及某些部分。它严重依赖于其他现有的标准和 RFC。例如,POST 请求和大部分通信都使用 xml-dsig,这与 HTTP-Request(URL 中的空间限制)不同。这本身就是一头野兽。
我支持 Net::SAML2,可以回答具体问题。尽管 SAML 规模很大,但它是一个相当简单(但非常复杂)的协议。挺喜欢的
【讨论】:
【参考方案2】:我想你指的是我的书=)SAML 2.0: Designing secure identity federation
SAML 不是直截了当和简单的,所以你不是唯一一个难以掌握它的人。您有很多问题,但我会尽力回答。
SAML 消息的发送方式称为绑定。例如 POST 或重定向。这些在bindings spec 中定义并在本书的第 6 章中讨论。
SAML 流量应始终使用 HTTPS,但此外,XML 应通过唱歌来防止消息在浏览器中被篡改,因为 HTTPS 无法防止这种情况发生。这些之间的区别在本书第 12 章的传输和消息保护中进行了讨论。
发送哪些消息以及如何发送它们以及如何在 SSO 中对其进行保护在 profiles spec 的 Web 浏览器 SSO 配置文件中进行了定义,并在本书的第 8 章中进行了讨论。
签名的处理方式和格式在SAML core spec的第 5.4 章中定义
我希望这有助于指导您正确。
【讨论】:
以上是关于我在哪里可以找到有关 SP 如何使用其私钥签署身份验证请求并将其发送到 IdP 的 URL 的信息?的主要内容,如果未能解决你的问题,请参考以下文章