我在哪里可以找到有关 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 的信息?的主要内容,如果未能解决你的问题,请参考以下文章

数字身份等于公钥+私钥?

签署认证请求

拥有一份 Apple 分发证书,但未安装其私钥。联系此证书的创建者以获取私钥的副本

如何使用椭圆曲线私钥和 ECDSA 算法签署证书?

如何用私钥签署字符串

如何签署请求令牌?