当前位置: 首页 > 知识库问答 >
问题:

KeyCloak和Spring SAML:SigAlg为null

公孙弘深
2023-03-14

我正在尝试使用Spring Security、Spring Security SAML和KeyClope设置POC。为此,我使用了Spring SAML核心项目提供的简单服务提供商示例。

只要Keycloak不需要客户端签名(已禁用客户端签名),我就设法让SAML设置正常工作。当我启用此选项时,我在Keycloak中得到以下错误和堆栈跟踪

07:07:40,385 WARN  [org.keycloak.events] (default task-8) type=LOGIN_ERROR, realmId=ea-localhost, clientId=null, userId=null, ipAddress=172.17.0.1, error=invalid_signature
07:07:44,961 ERROR [org.keycloak.protocol.saml.SamlService] (default task-7) request validation failed: org.keycloak.common.VerificationException: SigAlg was null
        at org.keycloak.protocol.saml.SamlProtocolUtils.verifyRedirectSignature(SamlProtocolUtils.java:135)
        at org.keycloak.protocol.saml.SamlService$RedirectBindingProtocol.verifySignature(SamlService.java:518)
        at org.keycloak.protocol.saml.SamlService$BindingProtocol.handleSamlRequest(SamlService.java:233)
        at org.keycloak.protocol.saml.SamlService$BindingProtocol.execute(SamlService.java:478)
        at org.keycloak.protocol.saml.SamlService.redirectBinding(SamlService.java:553)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

Spring的配置如下

spring:
  thymeleaf:
    cache: false
  security:
    saml2:
      service-provider:
        entity-id: spring-saml-test
        sign-metadata: false
        sign-requests: true
        want-assertions-signed: true
        keys:
          active:
            - name: key
              type: SIGNING
              private-key: |
                -----BEGIN RSA PRIVATE KEY-----
                SNIP
                -----END RSA PRIVATE KEY-----

              passphrase: SNIP
              certificate: |  
                -----BEGIN CERTIFICATE-----
                SNIP
                -----END CERTIFICATE-----
            - name: key
              type: ENCRYPTION
              private-key: |
                -----BEGIN RSA PRIVATE KEY-----
                SNIP
                -----END RSA PRIVATE KEY-----

              passphrase: SNIP
              certificate: |  
                -----BEGIN CERTIFICATE-----
                SNIP
                -----END CERTIFICATE-----

        providers:
        - name: keycloak
          metadata: |
                    <?xml version="1.0" encoding="UTF-8"?>
                    <EntityDescriptor entityID="http://localhost:8090/auth/realms/ea-localhost"
                                       xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
                                       xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"
                                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                       <IDPSSODescriptor WantAuthnRequestsSigned="true"
                          protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
                          <SingleLogoutService
                             Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                             Location="http://localhost:8090/auth/realms/ea-localhost/protocol/saml" />
                       <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat>
                       <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
                       <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</NameIDFormat>
                       <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat>

                          <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                             Location="http://localhost:8090/auth/realms/ea-localhost/protocol/saml" />
                          <KeyDescriptor use="signing">
                            <dsig:KeyInfo>
                              <dsig:KeyName>tURdSWRSOIQXpkOdAZzAevrtov8QU5ea0dqJpng2hSY</dsig:KeyName>
                              <dsig:X509Data>
                                <dsig:X509Certificate>SNIP</dsig:X509Certificate>
                              </dsig:X509Data>
                            </dsig:KeyInfo>
                          </KeyDescriptor>
                       </IDPSSODescriptor>
                    </EntityDescriptor>



          link-text: KEYCLOAK LOCAL IDP
          name-id: urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress

这是一个发送到keycloak的示例请求

<?xml version="1.0" encoding="UTF-8"?>
<saml2p:AuthnRequest AssertionConsumerServiceIndex="0" AssertionConsumerServiceURL="http://localhost:8080/sample-sp/saml/sp/SSO" Destination="http://localhost:8090/auth/realms/ea-localhost/protocol/saml" ForceAuthn="false" ID="1a072bcf-2822-424d-98ea-5e1f0c3b83b7" IsPassive="false" IssueInstant="2018-05-31T08:00:42.939Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0" xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
    <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">spring-saml-test</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="#1a072bcf-2822-424d-98ea-5e1f0c3b83b7">
                <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>R/D3Qk8KmcZdTwBZypDDq+D8lcMpvYcElmiwg01dYK0=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>
gldzIzX2Ti+nHhz99jQgLwLQ1IZnNJBGM39MpBo7pcFmWQ83Y4R4Bv+OfGbdmqO8GTbZo86zjRM0
+c1w+/QFvbZv4hEudIFuuDbzgCcTG2tyFau525+T7IZcBuPXexYEE+JX/y9cZifo7ws7EolfUC/V
e3qHlYGzOx/cPx6qPem6QawDaU8X46WkYDIOjAJGxrbqGY8fR3YC+PGndD4/+47Zrcp58REBUDPH
X680RZJP+06nnOIS5seKuIOyzEYmz8FLrsN2RLy0QnR3Qws+aWoP0ut04CFgmpcV5JmmNpMXASIT
86Xy53N6q1XvXqAhZuwG1WUriJBZD0mCPDmDhA==
        </ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>SNIP</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </ds:Signature>
    <saml2p:NameIDPolicy AllowCreate="true" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"/>
    <saml2p:RequestedAuthnContext Comparison="exact"/>
</saml2p:AuthnRequest>

我尝试了不同的组合,但一旦KeyClope验证了签名,就会抛出异常。KeyClope中导致异常的代码如下:

public static void verifyRedirectSignature(SAMLDocumentHolder documentHolder, KeyLocator locator, UriInfo uriInformation, String paramKey) throws VerificationException {
    MultivaluedMap<String, String> encodedParams = uriInformation.getQueryParameters(false);
    String request = encodedParams.getFirst(paramKey);
    String algorithm = encodedParams.getFirst(GeneralConstants.SAML_SIG_ALG_REQUEST_KEY);
    String signature = encodedParams.getFirst(GeneralConstants.SAML_SIGNATURE_REQUEST_KEY);
    String relayState = encodedParams.getFirst(GeneralConstants.RELAY_STATE);
    String decodedAlgorithm = uriInformation.getQueryParameters(true).getFirst(GeneralConstants.SAML_SIG_ALG_REQUEST_KEY);

    if (request == null) throw new VerificationException("SAM was null");
    if (algorithm == null) throw new VerificationException("SigAlg was null");
    if (signature == null) throw new VerificationException("Signature was null");

我在这里做错了什么?或者是Spring Saml的Keycloak中的一个错误?我使用的是Keycloak 4.0.0。Beta2,但在最新的v3中也出现了同样的问题。我已经从github(2.0.0。BUILD-SNAPSHOT,48ccd77ebabb5465af81a53b7095cdfb466a62b5)中提取了最新的Spring Security-saml代码。

共有1个答案

相弘方
2023-03-14

AuthNRequest作为REDIRECT发送,但格式化为POST。这是一个错误。

https://github.com/spring-projects/spring-security/issues/7711

解决方法是关闭传入AuthNRequest的签名要求,以确保IDP使用白名单/配置的URL,而不是AuthNRequest消息本身中的URL。

 类似资料:
  • 我正在使用Quarkus 1.0.1框架开发一套微服务。我希望使用KeyCloak8.0.1作为我的身份提供程序来保护这些信息。我已经在一个Docker容器中启动并运行了Keycloak,并为我的微服务配置了一个领域和相应的客户机。现在我到了我想保护他们的地步,我遇到了一个问题。 我的REST服务没有为它配置的注释或任何授权要求。这应该意味着,即使我没有经过身份验证,我也能够访问该服务。但是,当我

  • 谁能告诉我如何迁移keycloak和spring security。我已经遵循了http://keycloak.github.io/docs/userguide/keycloak-server/html/ch08.html#spring-security-adapter中步骤。但它很管用。我需要编写自己的提供程序吗? 我的原始spring-security.xml 我们很抱歉... 无效参数:re

  • 我在通过oauth2-proxy/keycloak对kubernetes webapp进行身份验证时遇到问题。你不知道出了什么问题 WebApp(test-app.domain.com) oauth2-proxy(oauth2-proxy.domain.com) keycloak(keycloak-test.domain.com) Keycloak登录页面显示正确,但在用户登录后,我得到:500

  • 我使用的是spring boot 2.1.7版本和keycloak-spring-boot-2-starter:4.0.0.final版本。这个keycloak-spring-boot-2-starter自动下载所需的keycloak适配器依赖项,对应于4.0.0..keycloak适配器依赖项的最终版本。现在,当我调用受keycloak保护的资源(rest api需要由keycloak服务器授权

  • 我在独立配置中使用Keycloak-8.0.1。我正在尝试为运行在我的测试机器(A.B.C.D)上的Keycloak服务器启用SSL/HTTPS,将从机器(X.Y.Z.P)请求令牌请求。 (生成的令牌会有任何CORS/CSRF问题吗?看起来是的?SSL上的Keycloak会帮助解决这个问题吗?)不过,我需要启用SSL。 于是就开始了https://www.keycloak.org/docs/lat

  • 也许我做错了什么。 CORS策略阻止从来源“https://www.keycloak.org”访问“https://accounts.zoodexchange.com/auth/realms/development/protocol/openid-connect/token”处的XMLHttpRequest:请求的资源上没有“access-control-allow-orgin”标头。 您可以使用