【问题标题】:Spring Boot SAML using AWS SSO as IdP errors with Bad InputSpring Boot SAML 使用 AWS SSO 作为 IdP 错误,输入错误
【发布时间】:2022-01-10 15:10:02
【问题描述】:

我想构建一个使用 Spring Boot 托管的站点,并且我想使用 AWS SSO 作为 SAML 身份提供商进行身份验证。我已经构建了一个 PoC 应用程序并尝试遵循 AWS 配置说明和我可以找到的 Spring SAML 示例,但是当我浏览到我的站点(在本地主机上)时,AWS SSO 成功打开,但随后因“输入错误”而失败。

在我的 PoC 应用程序中(只有身份验证代码和索引页面)我有:

  • 添加了spring-security-saml2-service-provider 依赖项(Spring Boot v2.6.2)
  • 在 AWS SSO 中设置自定义应用程序
  • 生成了一个私钥和一个自签名证书
  • 如下配置我的应用程序属性:
spring:
  security:
    saml2:
      relyingparty:
        registration:
          metadata:
            signing.credentials:
                - private-key-location: classpath:key.pem
                  certificate-location: classpath:cert.pem
            identityprovider:
              metadata-uri: https://portal.sso.eu-west-1.amazonaws.com/saml/metadata/my-custom-applications-metadata-uri
  • 我的配置文件有这些 bean:
@Bean
    RelyingPartyRegistrationResolver relyingPartyRegistrationResolver(
            RelyingPartyRegistrationRepository registrations) {
        return new DefaultRelyingPartyRegistrationResolver((id) -> registrations.findByRegistrationId("metadata"));
    }

    @Bean
    FilterRegistrationBean<Saml2MetadataFilter> metadata(RelyingPartyRegistrationResolver registrations) {
        Saml2MetadataFilter metadata = new Saml2MetadataFilter(registrations, new OpenSamlMetadataResolver());
        FilterRegistrationBean<Saml2MetadataFilter> filter = new FilterRegistrationBean<>(metadata);
        filter.setOrder(-101);
        return filter;
    }
  • 然后,我从我的 Spring Boot 应用程序(通过 http://localhost:8080/saml2/service-provider-metadata/metadata)下载了元数据并将其输入到 AWS 自定义应用程序配置中。这将 ACS 设置为http://localhost:8080/login/saml2/sso/metadata,将观众设置为http://localhost:8080/saml2/service-provider-metadata/metadata,这似乎是正确的。我的应用程序启动 URL 和中继状态为空白。在属性映射中,我将Subject 设置为${user.email},格式为emailAddress

我使用了 SAML-tracer 插件来试图弄清楚当我向localhost:8080/ 发出请求时会发生什么。我们最终向 AWS 发出 SAML POST(见下文),AWS 重新路由到 GET https://portal.sso.eu-west-1.amazonaws.com/token/whoAmI 成功,然后最终重新路由到 GET https://portal.sso.eu-west-1.amazonaws.com/saml/v2/assertion/very-long-id 失败,400 Bad Request 使我们进入 AWS SSO 中出现问题的页面带有消息{message: "Bad input", __type: "com.amazonaws.switchboard.portal#InvalidRequestException"}。我尝试检查 CloudTrail 以查找更多信息,但它只记录事件AssumeRoleWithSAML,然后是ConsoleLogin,它们都成功了。这是我的应用程序发布到 AWS 的 SAML-tracer 显示的 SAML 数据(替换了可能敏感的信息):

<saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
                     AssertionConsumerServiceURL="http://localhost:8080/login/saml2/sso/metadata"
                     Destination="https://portal.sso.eu-west-1.amazonaws.com/saml/assertion/insert-long-id"
                     ID="a-long-id"
                     IssueInstant="2022-01-10T13:59:52.963Z"
                     ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                     Version="2.0"
                     >
    <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">http://localhost:8080/saml2/service-provider-metadata/metadata</saml2:Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
            <ds:Reference URI="#Anot-sure-if-secret-random-characters">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
                <ds:DigestValue>some-more-characters</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>a-long-base-64-encoded-block-of-characters</ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>a-long-encoded-certificate</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </ds:Signature>
</saml2p:AuthnRequest>

我试图找到有关 AWS SSO 期望如何发送数据或“错误输入”的实际含义的更多信息,但真的很难找到。我也尝试了一些尝试发送请求而不用我的私钥/证书签名,但这似乎并没有让我到任何地方。我怀疑密钥/证书过程有误,或者我没有正确设置 AWS,但我不确定如何继续。有人有什么想法吗?

【问题讨论】:

    标签: amazon-web-services spring-boot single-sign-on saml spring-saml


    【解决方案1】:

    问题在于 ACS 网址设置为 localhost。 ACS(断言消费者服务)URL 是 IdP 发送 SAML 断言的位置。

    您告诉 AWS SSO 将 SAML 断言发送给它自己,但这是行不通的。您的应用程序需要一个可公开路由的 IP。 AWS SSO 需要通过 Internet 发送 SAML 断言。

    可能还有其他问题(遇到 ACS 问题后,我并没有真正检查任何内容)。但是 ACS URL 是您当前的问题。

    【讨论】:

    • 谢谢!但是,我使用公共 IP 在 EC2 实例上上传了我的构建,我得到了完全相同的行为 - AWS SSO 打开但出现“错误输入”错误。我上传了新的元数据,以便 ACS 和 Audience 现在指向 my-public-ec2-ip:8080/...,它曾经是 localhost。你还有其他建议吗? ://
    【解决方案2】:

    错误是 IdP 证书未添加到 spring 应用程序中。

    为此,请在配置自定义应用程序时在 AWS SSO 中下载 AWS 证书,然后将该证书放在 src/main/resources/credentials/idp-certificate.crt

    这一步之后一切正常,包括使用localhost ACS URL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-26
      • 2021-09-04
      • 2014-12-11
      • 2014-12-24
      • 2015-07-11
      • 1970-01-01
      • 2014-09-04
      • 2021-03-01
      相关资源
      最近更新 更多