私はSpring SAMLを使用してユーザーを認証します。
デフォルトでは、SAML実装は1時間ごとにメタデータをリフレッシュします。
はorg.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.refresh()
作品が、(タイマーによって呼び出される)以降のすべての呼び出しを通して最初の実行は失敗:正しいSAML TLSProtocolSocketFactory設定
INFO: org.apache.commons.httpclient.HttpMethodDirector - Retrying request
ERROR: org.springframework.security.saml.trust.MetadataCredentialResolver - PKIX path construction failed for untrusted credential: [subjectName='CONTENT_REMOVED_FOR_STACKOVERFLOW']: unable to find valid certification path to requested target
ERROR: org.opensaml.saml2.metadata.provider.HTTPMetadataProvider - Error retrieving metadata from https://HOSTNAME/PATH?cmd=metadata
javax.net.ssl.SSLPeerUnverifiedException: SSL peer failed hostname validation for name: null
at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.verifyHostname(TLSProtocolSocketFactory.java:233)
at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.createSocket(TLSProtocolSocketFactory.java:194)
at org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory.createSocket(TLSProtocolSocketFactory.java:97)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at org.opensaml.saml2.metadata.provider.HTTPMetadataProvider.fetchMetadata(HTTPMetadataProvider.java:250)
at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.refresh(AbstractReloadingMetadataProvider.java:260)
at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider$RefreshMetadataTask.run(AbstractReloadingMetadataProvider.java:521)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
DEBUG: org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider - Error occurred while attempting to refresh metadata from 'https://HOSTNAME/PATH?cmd=metadata'
org.opensaml.saml2.metadata.provider.MetadataProviderException: Error retrieving metadata from https://HOSTNAME/PATH?cmd=metadata
at org.opensaml.saml2.metadata.provider.HTTPMetadataProvider.fetchMetadata(HTTPMetadataProvider.java:274)
at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.refresh(AbstractReloadingMetadataProvider.java:260)
at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider$RefreshMetadataTask.run(AbstractReloadingMetadataProvider.java:521)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Caused by: javax.net.ssl.SSLPeerUnverifiedException: SSL peer failed hostname validation for name: null
at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.verifyHostname(TLSProtocolSocketFactory.java:233)
at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.createSocket(TLSProtocolSocketFactory.java:194)
at org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory.createSocket(TLSProtocolSocketFactory.java:97)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at org.opensaml.saml2.metadata.provider.HTTPMetadataProvider.fetchMetadata(HTTPMetadataProvider.java:250)
... 4 common frames omitted
は私が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は以前登録さ(org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory
)HTTPSプロトコルorg.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory
と(org.apache.commons.httpclient.protocol.Protocol
) を上書き。
最初の呼び出しではorg.opensaml.ws.soap.client.http.TLSProtocolSocketFactory
が使用され、すべてのタイマー呼び出しは失敗します。org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory
が失敗します。
私の春の設定からTLSProtocolConfigurer
を削除すると、すべて正常に動作します。質問は、私は何も壊すことなくそれを行うことができますか?
私は報告すべきバグですか?
しかし、なぜ 'org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory'が例外をスローしないのですか? 'refresh()'全体が機能し、 'org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory'で失敗します。 –
あなたの "最初の呼び出し"とスケジューラからの呼び出しは同じホスト( - 名前)から来ていますか?もしそうなら、Spring TLSProtocolSocketFactoryはデフォルトでホスト名検証を有効にしているようですが、OpenSAML TLSProtocolSocketFactoryはそうではありません。これを設定するには、プロパティなどが必要です。 –
最初のスケジューラ呼び出しと同じホストからのスケジューラ呼び出しがあります。 OpenSAML TLSProtocolSocketFactoryでは 'hostnameVerifier'が' XMLTOOLING_STRICT'に設定されています。 'verifyHostname()'メソッドでは、ホストは例外なく検証されます。 –