Spring SAML - 使用来自密钥库的多个IDP证书而不是元数据XML

时间:2017-01-11 20:49:18

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

  • 我能够将我的应用程序(SP)与Okta(IDP)集成。
    • 我将只执行IDP启动的登录。
    • 但Okta不会是我唯一的IDP,我不想继续向我的应用程序添加新的IDP元数据XML(因为这意味着我需要编辑我的spring XML文件并添加新的IDP并重启服务器)。 / LI>

所以我只想将IDP x509certificates(公钥)导入我的密钥库,并使用它们来验证我的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>

谢谢,

阿布舍克巴克

1 个答案:

答案 0 :(得分:0)

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

  1. 我将DataGridViewCellFormattingEventArgs更改为securityProfile而非默认pkix

    metaIOP

  2. 将证书添加到.jks文件中:<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>

  3. 实施keytool -importcert -file certificate.txt -keystore keystore.jks -alias "Alias"并注入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>

  4. 实现了几个类来覆盖元数据XML的需要。 <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>SAMLProcessorImpl

  5. 我删除了对WebSSOProfileConsumerImpl / getPeerEntityID的依赖关系,并将其替换为getPeerEntityMetadata.getEntityID(),因为SAML必须相同才能正常工作。 信任证书从密钥库中获取,密钥库在启动期间加载一次。

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