Spring SAML:SAML 消息预期目标端点与收件人端点不匹配

Posted

技术标签:

【中文标题】Spring SAML:SAML 消息预期目标端点与收件人端点不匹配【英文标题】:Spring SAML: SAML message intended destination endpoint did not match recipient endpoint 【发布时间】:2019-07-27 11:20:34 【问题描述】:

在我的应用 SP 和客户端 IdP 之间进行 SSO 时,我收到 'Caused by: org.opensaml.xml.security.SecurityException: SAML message intended destination endpoint did not match recipient endpoint' 异常。

服务器日志显示架构的差异,见下文:

Checking SAML message intended destination endpoint against receiver endpoint
2019-03-05 15:02:44.599 DEBUG [204 default task-41][BaseSAMLMessageDecoder] Intended message destination endpoint: https://my.app.com/app-gateway/saml/SSO
2019-03-05 15:02:44.599 DEBUG [204 default task-41][BaseSAMLMessageDecoder] Actual message receiver endpoint: http://my.app.com/app-gateway/saml/SSO
2019-03-05 15:02:44.600 ERROR [204 default task-41][BaseSAMLMessageDecoder] SAML message intended destination endpoint 'https://my.app.com/app-gateway/saml/SSO' did not match the recipient endpoint 'http://my.app.com/app-gateway/saml/SSO'

我的应用程序在 2 个实例上的 STG 上运行,前面有 LB,因此我使用 SAMLContextProviderLB 上下文提供程序而不是 SAMLContextProviderImpl

<bean id="contextProvider" class="org.springframework.security.saml.context.SAMLContextProviderLB">
        <property name="scheme" value="https"/>
        <property name="serverName" value="my.app.com"/>
        <property name="serverPort" value="443"/>
        <property name="includeServerPortInRequestURL" value="false"/>
        <property name="contextPath" value="/app-gateway"/>
    </bean>

<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
        <constructor-arg>
            <bean class="org.springframework.security.saml.metadata.MetadataGenerator">
                <property name="entityBaseURL" value="https://my.app.com/app-gateway1"/>
                <property name="entityId" value="$cas.sso.entityId"/>
                <property name="includeDiscoveryExtension" value="false"/>
                <property name="extendedMetadata" ref="extendedMetadata"/>
                <property name="keyManager" ref="keyManager"/>
            </bean>
        </constructor-arg>
    </bean>

getActualReceiverEndpointURI 的源代码中,接收者端点URL 是从请求httpRequest obj 中获取的。 因此,我试图了解在哪一步设置了错误的 URL http://my.app.com/app-gateway/saml/SSO。谁能给我解释一下?

protected String getActualReceiverEndpointURI(SAMLMessageContext messageContext) throws MessageDecodingException 
        InTransport inTransport = messageContext.getInboundMessageTransport();
        if (! (inTransport instanceof HttpServletRequestAdapter)) 
            log.error("Message context InTransport instance was an unsupported type: ", 
                    inTransport.getClass().getName());
            throw new MessageDecodingException("Message context InTransport instance was an unsupported type");
        
        HttpServletRequest httpRequest = ((HttpServletRequestAdapter)inTransport).getWrappedRequest();

        StringBuffer urlBuilder = httpRequest.getRequestURL();

        return urlBuilder.toString();
    

【问题讨论】:

你的应用服务器和你的LB之间的通信是如何完成的? Http,https,ajp,还有什么? @SébastienPRAT,感谢您的评论。 LB(梭子鱼)通过http与应用程序通信。 问题是 TLS/SSL 卸载。 SAML 库使用“request.getScheme()”,这将返回“http”而不是“https”,因此收件人检查失败。使用哪个部署容器? @BernhardThalmayr。感谢您的回答。 WildFly 10.1.0 Final 用作应用服务器。你知道,我怎样才能改变它并强制它使用https? 【参考方案1】:

对于运行在 AWS 应用程序负载均衡器后面的 Apache Tomcat 服务器,需要启用 RemoteIPValue 以便基于 x-forwarded-proto 标头,Tomcat 将覆盖 scheme (https) 和 port(443) 相应地。

server.xml

<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto" internalProxies="10\.\d+\.\d+\.\d+|192\.168\.\d+\.\d+|169\.254\.\d+\.\d+|127\.\d+\.\d+\.\d+|172\.(1[6-9]|2[0-9]|3[0-1])\.\d+\.\d+" />

【讨论】:

【参考方案2】:

您可能需要查看以下页面: https://developer.jboss.org/thread/240113

我遇到了类似的问题,即使在 LB 上正确设置了 X-Forwarded-Proto,请求仍然只在 http 中解释。 后端必须知道标头。

在http监听器上添加proxy-address-forwarding="true"和两个filter-ref

<http-listener name="default" socket-binding="http" proxy-address-forwarding="true"/>  
            <filter-ref name="server-header"/>  
            <filter-ref name="x-powered-by-header"/>  

希望对您有所帮助,

【讨论】:

以上是关于Spring SAML:SAML 消息预期目标端点与收件人端点不匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Spring SAML 目标端点?

Spring-SAML:传入的 SAML 消息无效

Spring Security SAML 扩展和@PreAuthorize

Spring SAML 与 WSO2 身份服务器集成,无法识别 SAML 消息

spring saml:LOGOUT 是如何处理的?是不是必须在 IDP 元数据 xml 中有注销端点?

Spring boot SAML 2 身份验证对象 null