Spring Security SAML 可信证书条目不受密码保护

Posted

技术标签:

【中文标题】Spring Security SAML 可信证书条目不受密码保护【英文标题】:Spring Security SAML trusted certificate entries are not password-protected 【发布时间】:2014-11-16 22:21:19 【问题描述】:

我正在将 spring-saml2-sample 应用程序集成到我自己的应用程序中。我的服务提供商连接到 Shibboleth IDP。 我正在使用 Spring Security SAML 应用程序附带的 samlKeystore.jks 中提供的私有证书测试 SP。我使用以下命令在密钥库中注册了 IDP 签名公钥: keytool -importcert -alias idpSignKey -keypass passwordS -file key.cer -keystore samlKeystore.jks

我能够运行应用程序并使用 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) org.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>

【问题讨论】:

【参考方案1】:

IDP 的证书通常不需要导入密钥库,因为它们是从 IDP 的元数据中提供的。您应该只使用ExtendedMetadata 和属性signingKey 和/或encryptionKey,以防您想补充元数据中已有的密钥。

由于文件key.cer 仅包含您的 IDP 的公钥,您无法对其进行密码保护。您应该简单地将其从用于初始化JKSKeyManagerMap 中删除,因为它只需要包含私钥的条目的密码。初始化将如下所示:

<!-- 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>

【讨论】:

以上是关于Spring Security SAML 可信证书条目不受密码保护的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security SAML 请求在证书中包含 ^M 个字符

使用来自 Okta 的证书的 SAML 问题

未抛出 Spring Security SAML DisabledException

没有 Spring Boot 的 Spring Security SAML 身份元数据

spring security saml使用哪个密钥?

如何使用 spring-security-saml2 配置服务提供者以使用 EncryptedAssertions?