13

我正在与 IDP 交互,并创建了一个基本的 AuthNRequest,如下所示:

<samlp:AuthnRequest
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="IDTest1" 
  Version="2.0"
  IssueInstant="2013-03-04T09:21:59"
  AssertionConsumerServiceIndex="0"
  AttributeConsumingServiceIndex="0">
  <saml:Issuer>https://myapp.com/saml2/sp</saml:Issuer> 
 <samlp:NameIDPolicy
   AllowCreate="true"
   Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>     

IDP 希望我按签名发送请求。我的问题是:

  1. 如何设置摘要值?
  2. 如何设置签名值?
  3. 对于 x509 证书,我设置了我的应用程序的公钥。正确的?
  4. 用于计算任何值的数据是什么?这是我没有签名元素的原始身份验证请求吗?
4

6 回答 6

9

请注意,文档中涵盖了很多内容:

SAML 元数据

要签署请求,您需要添加类似这样的内容(通常在 sp.xml 中找到):

<SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="false"
                 protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">

签名密钥看起来像:

<KeyDescriptor use="signing">
    <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
            <ds:X509Certificate>
                MIIDWTC...CAkGgAwIBAgIEe+a+/uaSZCp5g2z+hRWRV+DyfQc9nO
            </ds:X509Certificate>
        </ds:X509Data>
    </ds:KeyInfo>
</KeyDescriptor>

其中 MII... 是公钥。

根据@Stefan,使用库要容易得多。

于 2013-03-07T18:10:53.690 回答
5

SAML 身份验证请求是一个 XML 文档。您可以像签署任何其他 XML 文档一样签署 SAML 身份验证请求。但是,有一些限制:

  1. 签名必须是信封的签名。
  2. 在被消化之前,SAML Authentication Request 不能通过封装签名转换和排他规范化转换以外的方法进行转换。
  3. Signature 元素必须只包含一个 Reference 元素。
  4. 唯一的 Reference 元素的 URI 必须包含签名的 SAML 身份验证请求的 ID 属性的值。
  5. 在签名之前,必须使用专有规范化方法对 SignedInfo 元素进行规范化。

您可以在第 5 节中阅读更详细的 SAML 断言和协议规范 ( http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf )。

于 2013-03-09T11:41:40.153 回答
5

你的问题不充分!

您发送的 AuthRequest 似乎是REDIRECT请求,您将看不到摘要、签名和证书,因为所有这些详细信息都将作为参数在 URL 中。

尝试使用POST SSO请求,您将在其中看到 SAML 请求中的摘要、签名和证书。

一些要点:

常见的

  • IdP 和 SP 都应该共享它们Metadata,它们将具有它们的基本配置,例如 id、签名算法、散列方法、公钥等。
  • 因此,根据 IdP 之间的合同,您应该使用您喜欢的编程语言对您的请求进行哈希处理和签名。

SP:

  • 您应该使用您的公钥进行加密。
  • 您应该使用您的私钥进行签名。
  • 您应该使用 Base64 对您的请求进行编码。

国内流离失所者:

  • 他们将使用请求中的公钥进行身份验证。
  • 他们将使用加密和签名的 XML 进行响应。
  • 您应该解密并取消签名响应。

快速链接

  1. SAML 2.0 官方文档

  2. OneLogin 的 SAML 在线工具

于 2017-10-17T16:41:40.943 回答
3

如果您在没有任何更大框架的情况下构建自己的请求,我可以推荐 OpenSAML。它是一个帮助构建 SAML 消息的库。

在我的《OpenSAML 指南》一书中,详细解释了这一点以及更多内容。

编辑我已经发布了本书的新版本,涵盖 OpenSAML V3

是我写的关于签署 SAML 消息的示例

还有一个关于如何发送 AuthnRequests。

于 2013-03-07T09:46:01.063 回答
2

好吧,有关安全的事情从来都不是一件容易的事……您应该明确检查由@nzpcmad 链接的文档以及 SAML2 配置文件(查找 WB SSO - Web Browser Single Sign On)。

对于 Java,OpenSaml 确实是最简单的解决方案之一。

于 2013-03-08T11:49:16.807 回答
1

一个陷阱似乎是使用 HTTP 重定向绑定签名由附加 URL 参数传输,而不是 SAMLRequest 值的一部分,例如https://my-idp.com/login?SAMLRequest=nVNN...%3D&SigAlg= http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmldsig-more%23rsa-sha256&Signature=QZ64...%3D%3D

于 2017-03-20T11:19:52.973 回答