2015-04-03 160 views
1

我有幾個關於如何使用Spring Security SAML擴展v1.0發佈來處理SSL(HTTPS)連接的問題。Spring Security SAML - HTTPS連接

我使用擴展來開發SP。我正在使用的遠程IDP具有HTTPS URL。我擁有root用戶並在Tomcat使用的JRE cacerts密鑰庫中爲該SSL證書頒發證書。 IDP的元數據通過HTTPMetadataProvider加載得很好。在ExtendedMetadata我的SP的元數據,我有:

<property name="securityProfile" value="metaiop"/> 
<property name="sslSecurityProfile" value="pkix"/> 

當我打我的SP,我重定向到我的IDP就好了,我提供我的憑據。然後,IDP將我送回我的SP。但是我在這裏得到一個錯誤 ERROR org.springframework.security.saml.trust.MetadataCredentialResolver PKIX path construction failed for untrusted credential

日誌顯示這是在SOAP消息建立之後發生的。我想我的SP正試圖連接到我的IDP以獲得工件解析。

在Spring SAML文檔的第7.2.3節中,它說默認情況下,HTTPS元數據連接將使用Java的密鑰庫。我已經如上所述照顧了。但在第8.1.4節中,它表示直接的SSL/TLS連接(與HTTP-Artifact綁定一起使用)需要驗證服務器提供的公鑰,並且應該檢索證書並將其作爲通常的公鑰導入密鑰庫。我假設這意味着在JKSKeyManager中定義的SP的密鑰庫。當我將IDP中的SSL證書導入SP密鑰庫時,錯誤消失,一切正常。

第一個問題 這是處理這個問題的正確方法嗎?工件解析可以通過HTTPS不使用JRE的cacerts密鑰庫?

第二個問題 如果我不導入證書到SP密鑰存儲和改變sslSecurityProfile價值metaiop,我還得到一個錯誤在同一點上,而是它說:SSL peer failed hostname validation for name: null即使我設置sslHostnameVerificationallowAll。爲什麼會發生?

根據我對MetaIOP配置文件的理解,它在IDP的元數據中查找證書。由於該證書與SSL證書不同,因此失敗。正確?

回答

3

是的,在Artifact解析期間打開的HTTPS連接僅使用samlKeystore.jks(或其他配置的KeyManager)中的密鑰進行信任解析,因此忽略cacerts。

將SSL上的安全配置文件更改爲MetaIOP意味着您必須導入在HTTPS端點使用的確切證書(導入到密鑰庫或導入IDP的元數據 - 它會同時檢查兩者)。系統也不會驗證證書的有效性(或通過標準PKIX算法驗證的任何其他值)。

使用PKIX,您可以導入證書頒發機構的證書,系統將自動信任由其頒發的證書。

我相信系統主機名驗證失敗的原因是由於Java 8中的一些變化所致。Spring SAML將從X509TrustManager中拋出CertificateException--向JDK表明服務器不可信,但JDK不報告此異常進一步,而是它返回一個空的SSLSession - 隨後主機名爲空的主機名驗證失敗。

應檢查SSLSession是否正確打開的主機名驗證邏輯位於OpenSAML(TLSProtocolSocketFactory)中,可能會在更高版本中進行修改。

所以這個例外是有點誤導,但否則系統的行爲是正確的。

+0

謝謝弗拉基米爾! – AndyB 2015-04-03 19:36:12

+0

嘿Vladimír,任何想法爲什麼我得到這個錯誤在這裏/ saml/SSO(後)一旦它從IDP回來? java.lang.NoClassDefFoundError:無法初始化類org.apache.commons.ssl.TrustMaterial – Gemasoft 2016-12-14 15:28:53

相關問題