2016-04-18 129 views
2

私は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を削除すると、すべて正常に動作します。質問は、私は何も壊すことなくそれを行うことができますか?
私は報告すべきバグですか?

答えて

0

例外は、証明書で定義されているホスト名を検証できないことを示しています。したがって、タイマーはホストのwhoes名が証明書の名前と一致しない場合に実行されます。これはバグではありません。

+0

しかし、なぜ 'org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory'が例外をスローしないのですか? 'refresh()'全体が機能し、 'org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory'で失敗します。 –

+0

あなたの "最初の呼び出し"とスケジューラからの呼び出しは同じホスト( - 名前)から来ていますか?もしそうなら、Spring TLSProtocolSocketFactoryはデフォルトでホスト名検証を有効にしているようですが、OpenSAML TLSProtocolSocketFactoryはそうではありません。これを設定するには、プロパティなどが必要です。 –

+0

最初のスケジューラ呼び出しと同じホストからのスケジューラ呼び出しがあります。 OpenSAML TLSProtocolSocketFactoryでは 'hostnameVerifier'が' XMLTOOLING_STRICT'に設定されています。 'verifyHostname()'メソッドでは、ホストは例外なく検証されます。 –

関連する問題