2014-09-22 105 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