Java 正确的SAML TLSProtocolSocketFactory配置

Java 正确的SAML TLSProtocolSocketFactory配置,java,spring,spring-security,saml,Java,Spring,Spring Security,Saml,我用于验证用户。 默认情况下,SAML实现每小时刷新其元数据。 初始运行通过org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.refresh()运行,但所有后续调用(由计时器调用)都失败: 我将其追溯到org.springframework.security.saml.trust.httpclient.TLSProtocolConfigurerbean <bean class="org.spring

我用于验证用户。
默认情况下,SAML实现每小时刷新其元数据。
初始运行通过
org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.refresh()
运行,但所有后续调用(由计时器调用)都失败:

我将其追溯到
org.springframework.security.saml.trust.httpclient.TLSProtocolConfigurer
bean

<bean class="org.springframework.security.saml.trust.httpclient.TLSProtocolConfigurer">
    <property name="sslHostnameVerification" value="default"/>
    <property name="keyManager" ref="keyManager"/>
</bean>

afterPropertiesSet()
中,此bean覆盖先前注册的https协议(
org.apache.commons.httpclient.protocolsocketfactory
)(
org.apache.commons.httpclient.protocol.protocol
) 使用
org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory

因此,第一个调用使用
org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory
有效,所有计时器调用使用
org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory
失败

如果我从spring配置中删除
TLSProtocolConfigurer
,一切正常。问题是,我能做到这一点而不破坏任何东西吗?

这是一个我应该报告的错误吗?

例外情况是,它无法验证证书中定义的主机名。因此,计时器是在名称与证书中的名称不匹配的主机上执行的。所以这不是一个bug。

好吧,但是为什么
org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory
没有抛出异常?使用它,整个
refresh()
工作,使用
org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory
失败。您的“第一次调用”和来自调度程序的调用是否来自同一主机(-name)?如果是这样,那么Spring TLSProtocolSocketFactory似乎默认启用了主机名验证,而OpenSAML TLSProtocolSocketFactory没有。应该有一个属性或类似的属性来设置这一点……是的,首先,调度程序调用来自同一主机。在OpenSAML TLSProtocolSocketFactory中,
hostnameVerifier
设置为
XMLTOOLING\u STRICT
。在方法
verifyHostname()
中,主机被毫无例外地验证。这听起来很奇怪。证书中定义了什么主机名,调用的源主机名是什么,即这两个主机名相同吗?出于安全原因,我不想公布主机名,我不确定证书中是否声明了主机名。但我认为这并不重要,因为在异常情况下,
stringhostname=sslSession.getPeerHost()
主机名
null
。这在第一次调用中不是
null
<bean class="org.springframework.security.saml.trust.httpclient.TLSProtocolConfigurer">
    <property name="sslHostnameVerification" value="default"/>
    <property name="keyManager" ref="keyManager"/>
</bean>