【问题标题】:Spring SAML - Using multiple IDP certificates from keystore instead of metadata XMLSpring SAML - 使用来自密钥库的多个 IDP 证书而不是元数据 XML
【发布时间】:2017-05-26 19:23:46
【问题描述】:
  • 我能够将我的应用程序 (SP) 与 Okta (IDP) 集成。
    • 我将只执行 IDP 发起的登录。
    • 但是 Okta 不会是我唯一的 IDP,我不想继续向我的应用程序添加新的 IDP 元数据 XML(因为这意味着我需要编辑我的 spring XML 文件并添加一个新的 IDP 并重新启动服务器)。

所以我只想将 IDP x509 证书(公钥)导入我的密钥库并使用它们来验证我的 SAML 响应。那可能吗? 或者换句话说,我想在运行时注册 IDP,而不对我的应用程序进行任何更改或重新启动它。

如果是,您能否提供有关如何做到这一点的资源?

目前我在我的应用程序的 spring xml 文件中提供了 Okta 的元数据 XML,如下所示。

<bean id="metadata" class="org.springframework.security.saml.metadata.MetadataManager">
    <constructor-arg>
        <list>
        <bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider">
            <constructor-arg>
                <value type="java.io.File">C:\\DEV\\idp_metadata\\metadata.xml</value>
            </constructor-arg>
                <property name="parserPool" ref="parserPool" />
        </bean>
        </list>
    </constructor-arg>

</bean>

谢谢,

阿布舍克

【问题讨论】:

    标签: single-sign-on metadata x509certificate keystore spring-saml


    【解决方案1】:

    我完成了对我的应用程序的更改,使其依赖于密钥库中存在的 IDP 证书。 但需要注意的是,如果将来添加新的 IDP 证书,则需要重新启动服务器。

    1. 我将securityProfile 更改为pkix,而不是默认的metaIOP

      <bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate"> <constructor-arg> <bean class="org.opensaml.saml2.metadata.provider.ResourceBackedMetadataProvider"> <constructor-arg> <bean class="java.util.Timer" /> </constructor-arg> <constructor-arg> <bean class="org.opensaml.util.resource.FilesystemResource"> <constructor-arg value="${path.to.SP.metadata}" /> </bean> </constructor-arg> <property name="parserPool" ref="parserPool" /> </bean> </constructor-arg> <constructor-arg> <bean class="org.springframework.security.saml.metadata.ExtendedMetadata"> <property name="local" value="true" /> <property name="securityProfile" value="pkix" /> <property name="sslSecurityProfile" value="pkix" /> <property name="requireArtifactResolveSigned" value="false" /> <property name="requireLogoutRequestSigned" value="false" /> <property name="requireLogoutResponseSigned" value="false" /> <property name="idpDiscoveryEnabled" value="false" /> <property name="supportUnsolicitedResponse" value="true" /> </bean> </constructor-arg> </bean>

    2. 将证书添加到 .jks 文件:keytool -importcert -file certificate.txt -keystore keystore.jks -alias "Alias"

    3. 实现了SAMLContextProviderLB并注入了pkixresolver

      <bean id="contextProvider" class="org.springframework.security.saml.context.SAMLContextProviderLB"> <property name="scheme" value="${saml.loadBalancer.scheme}" /> <property name="serverName" value="${saml.loadBalancer.serverName}" /> <property name="serverPort" value="${saml.loadBalancer.serverPort}" /> <property name="includeServerPortInRequestURL" value="${saml.loadBalancer.includeServerPortInRequestURL}" /> <property name="contextPath" value="/contextPath" /> <property name="pkixResolver"> <bean class="org.springframework.security.saml.trust.PKIXInformationResolver"> <constructor-arg index="0" ref="metadataCredResolver" /> <constructor-arg index="1" ref="metadata" /> <constructor-arg index="2" ref="trustedKeyManager" /> </bean> </property> <property name="storageFactory"> <bean class="org.springframework.security.saml.storage.EmptyStorageFactory" /> </property> </bean>

      <bean id="metadataCredResolver" class="org.springframework.security.saml.trust.MetadataCredentialResolver"> <constructor-arg index="0" ref="metadata" /> <constructor-arg index="1" ref="trustedKeyManager" /> <property name="useXmlMetadata" value="false" /> </bean>

      <bean id="trustedKeyManager" class="org.springframework.security.saml.key.JKSKeyManager"> <constructor-arg value="${saml.trust.jks.filePath}" /> <constructor-arg type="java.lang.String" value="${saml.trust.jks.password}" /> <constructor-arg> <map> <entry key="${saml.trust.jks.defaultKey.name}" value="${saml.trust.jks.defaultKey.password}" /> </map> </constructor-arg> <constructor-arg type="java.lang.String" value="${saml.trust.jks.defaultKey.name}" /> </bean>

    4. 实现了一些类来覆盖对元数据 XML 的需求。 SAMLProcessorImplWebSSOProfileConsumerImpl

    我删除了对 getPeerEntityID / getPeerEntityMetadata.getEntityID() 的依赖并将其替换为 response.getIssuer().getValue() 因为两者必须相同才能使 SAML 工作。 信任证书是从启动时加载一次的密钥库中获得的。

    在下一次更新中,我将尝试弄清楚如何对 .jks 文件执行定时刷新以加载新证书。

    【讨论】:

    • 你能解释一下#4 - 实现了一些类来覆盖对元数据 XML 的需求。 SAMLProcessorImpl 和 WebSSOProfileConsumerImpl 更详细一点?
    猜你喜欢
    • 2015-03-27
    • 2015-09-20
    • 1970-01-01
    • 2015-03-14
    • 2018-11-24
    • 2012-06-06
    • 2019-09-11
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多