Spring SAML配置打破了其他http连接

时间:2016-07-28 07:32:35

标签: spring-security saml-2.0 spring-saml

我正在使用Spring SAML在我的应用程序中实现单点登录。从SSO的角度来看,Evreything已经集成并正常运行。 我的应用程序的另一项服务也通过Axis使用HTTP客户端发布失败,并出现以下错误

  

{http://xml.apache.org/axis/} stackTrace:javax.net.ssl.SSLPeerUnverifiedException:SSL对等名称的主机名验证失败:null

我已经查看了提供链接的答案 Spring Security SAML + HTTPS to another page并遵循同样但无济于事。

以下是TLSProtocolSocketFactory

的配置
    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass" value="org.apache.commons.httpclient.protocol.Protocol"/>
    <property name="targetMethod" value="registerProtocol"/>
    <property name="arguments">
        <list>
            <value>https</value>
            <bean class="org.apache.commons.httpclient.protocol.Protocol">
                <constructor-arg value="https"/>
                <constructor-arg>
                    <bean class="org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory">
                        <constructor-arg ref="keyManager"/>
                        <constructor-arg><null/></constructor-arg>
                        <constructor-arg value="allowAll"/>
                    </bean>
                </constructor-arg>
                <constructor-arg value="443"/>
            </bean>
        </list>
    </property>
</bean>

我也在samlKeystore.jks中导入了其他服务的证书。

该问题的任何帮助都是apreciated

2 个答案:

答案 0 :(得分:1)

我认为这可能是您正在寻找的内容:Source

您正在使用bean TLSProtocolConfigurer更改HTTP客户端中HTTPS协议的可信证书和主机名验证。您可以通过删除此bean将HTTP客户端的行为恢复为默认值。然后,您需要确保加载元数据的实体使用的证书(https://idp.ssocircle.com/idp-meta.xml)在您的cacerts中受信任,或者使用没有https(http://idp.ssocircle.com/idp-meta.xml)的端点。

或者,您可以通过在bean sslHostnameVerification上将属性allowAll设置为TLSProtocolConfigurer来禁用主机名验证。您还需要确保https://www.somepage.com(或其CA)的HTTPS证书包含在samlKeystore.jks中(请参阅Spring SAML manual)。

您可以在Spring SAML manual, chapter HTTP-based metadata provider with SSL中找到有关TLSProtocolConfigurer bean的更多详细信息。

答案 1 :(得分:0)

问题出在checkNames() PKIXX509CredentialTrustEngine的{​​{1}}函数中,我们仅针对trustedNames而不是null检查"null or Empty"集合。
< br />即使我们在TLSProtocolSocketFactory的{​​{1}}方法中将 trustedNames 的值作为 null 传递给{{1} }},此类的构造函数将getPKIXResolver()集合重新初始化为空集合。
将行从StaticPKIXValidationInformatonResolver更改为

{{1我解决了这个问题。