我将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>
谢谢你的快速答案!你一定在想“她在做什么?” – user3754289 2014-09-22 23:02:26
一点都不,当人们开始使用这些技术时,很容易出现“愚蠢”的错误。 – 2014-09-23 07:48:50
弗拉基米尔,关于补充关键:我们是否应该在元数据中添加一个新的?当IDP发送不在元数据xml中的密钥(在响应中)时,是否推荐处理该案例? –
Ritesh
2015-04-26 13:34:57