2014-09-22 107 views
3

我將spring-saml2示例應用程序集成到我自己的應用程序中。我的服務提供商連接到Shibboleth IDP。 我使用Spring Security SAML應用程序附帶的samlKeystore.jks中提供的私有證書測試SP。我註冊了IDP通過使用命令登錄密鑰庫公鑰: 密鑰工具-importcert -alias idpSignKey -keypass密碼-file key.cer -keystore samlKeystore.jksSpring Security SAML可信證書條目沒有密碼保護

我能夠運行應用程序,並登錄IDP。我可以在日誌中看到他們在saml消息中發回給我的公共證書與我在idp元數據中擁有的證書相對應,並在密鑰庫中註冊。從JKSKeyManager獲取idp憑據時,我的應用程序中斷了。

java.lang.UnsupportedOperationException:受信任的證書項是無密碼保護 java.security.KeyStoreSpi.engineGetEntry(來源不明) java.security.KeyStore.getEntry(來源不明) org.opensaml.xml.security .credential.KeyStoreCredentialResolver.resolveFromSource(KeyStoreCredentialResolver.java:132) org.opensaml.xml.security.credential.AbstractCriteriaFilteringCredentialResolver.resolve(AbstractCriteriaFilteringCredentialResolver.java:57) org.opensaml.xml.security.credential.AbstractCredentialResolver.resolveSingle(AbstractCredentialResolver .java:30) org.opensaml.xml.security.credential.AbstractCredentialResolver.resolveSingle(AbstractCredentialResolver的.java:26) org.springframework.security.saml.key.JKSKeyManager.resolveSingle(JKSKeyManager.java:172) org.springframework.security.saml.key.JKSKeyManager.getCredential(JKSKeyManager.java:194) 有機springframework.security.saml.trust.MetadataCredentialResolver.retrieveFromMetadata(MetadataCredentialResolver.java:102) org.opensaml.security.MetadataCredentialResolver.resolveFromSource(MetadataCredentialResolver.java:169)

這是怎樣的KeyManager看起來contextSecurity.xml:

<!-- Central storage of cryptographic keys --> <bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager"> <constructor-arg value="classpath:security/samlKeystore.jks"/> <constructor-arg type="java.lang.String" value="nalle123"/> <constructor-arg> <map> <entry key="apollo" value="nalle123"/> <entry key="idpSignKey" value="passwordS"/> <entry key="idpEncKey" value="passwordE"/> </map> </constructor-arg> <constructor-arg type="java.lang.String" value="apollo"/> </bean>

這是IDP擴展的元數據:

<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"> <property name="local" value="false"/> <property name="securityProfile" value="metaiop"/> <property name="sslSecurityProfile" value="pkix"/> <property name="signingKey" value="idpSignKey"/> <property name="encryptionKey" value="idpEncKey"/> <property name="requireArtifactResolveSigned" value="false"/> <property name="requireLogoutRequestSigned" value="false"/> <property name="requireLogoutResponseSigned" value="false"/> <property name="idpDiscoveryEnabled" value="false"/> </bean>

回答

5

證書境內流離失所者不需要通常被導入到密鑰存儲,因爲它們是從IDP的元數據來提供。如果您想補充元數據中已有的密鑰,則只應使用ExtendedMetadatasigningKey和/或encryptionKey

由於文件key.cer只包含您的IDP的公鑰,因此您無法對其進行密碼保護。您應該簡單地將它從Map中刪除,用於JKSKeyManager的初始化,因爲它只需要包含私鑰的條目的密碼。初始化看起來像這樣:

<!-- Central storage of cryptographic keys --> 
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager"> 
    <constructor-arg value="classpath:security/samlKeystore.jks"/> 
    <constructor-arg type="java.lang.String" value="nalle123"/> 
    <constructor-arg> 
     <map> 
      <entry key="apollo" value="nalle123"/> 
     </map> 
    </constructor-arg> 
    <constructor-arg type="java.lang.String" value="apollo"/> 
</bean> 
+0

謝謝你的快速答案!你一定在想「她在做什麼?」 – user3754289 2014-09-22 23:02:26

+0

一點都不,當人們開始使用這些技術時,很容易出現「愚蠢」的錯誤。 – 2014-09-23 07:48:50

+0

弗拉基米爾,關於補充關鍵:我們是否應該在元數據中添加一個新的?當IDP發送不在元數據xml中的密鑰(在響應中)時,是否推薦處理該案例? – Ritesh 2015-04-26 13:34:57