7.Spring Security SAML 元数据配置
7.元数据配置
SAML元数据是一个XML文档,其中包含与支持SAML的身份或服务提供者进行交互所需的信息。该文档包含例如端点的URL,关于支持的绑定的信息,标识符和公钥。通常会为您自己的服务提供商生成一个元数据文档,并将其发送给您要启用单点登录的所有身份提供商。同样,每个身份提供者都可以使用自己的元数据导入您的服务提供者应用程序。
每个元数据文档可以包含一个或多个身份或服务提供者的定义,并且可选地可以进行数字签名。可以通过直接修改XML文档或使用扩展元数据来自定义元数据。扩展元数据直接添加到Spring配置文件中,并且可以包含基本元数据文档中不可用的其他选项。
7.1服务提供商元数据
服务提供商元数据包含定义应用程序的SAML端点的密钥,服务和URL。元数据可以在第一次请求服务时自动生成,也可以预先创建(参见第11章,示例应用程序)。一旦创建了元数据,就需要提供给我们想要建立信任的身份提供者。
7.1.1自动生成元数据
通过在Spring Security配置中包含以下过滤器来启用自动元数据生成:
<security:custom-filter before="FIRST" ref="metadataGeneratorFilter"/>
此过滤器将作为对Spring Security处理的URL的第一个请求的一部分自动调用。如果尚未指定服务提供者元数据(意味着元数据 bean的属性hostedSPName为空),则过滤器将生成新的 元数据。
默认情况下,将使用以下值生成元数据,这些值可以通过设置metadataGenerator bean的属性进行自定义:
表7.1。元数据生成器设置
属性 | 描述 | 默认值 |
---|---|---|
entityBaseURL | 用于构造SAML端点的基本URL,需要是具有协议,服务器,端口和上下文路径的URL。 | Values from the request in format: scheme://server:port/contextPath |
entityId | 服务提供商的唯一标识符。 | <entityBaseUrl>/saml/metadata |
id | 签名中引用的根元数据元素的XML标识符。 | entityId with removed illegal characters (NCName) |
requestSigned | 指示此服务是否签署认证请求的标志。 | true |
wantAssertionSigned | 指示此服务是否需要签名断言的标志。 | true |
bindingsSSO | 要包含在WebSSO配置文件的元数据中的绑定。支持的值包括:POST,Artifact和PAOS。属性中的绑定顺序确定生成的元数据中端点的顺序。 | POST, Artifact |
bindingsHoKSSO | 要包含在WebSSO Holder-of-Key配置文件的元数据中的绑定。支持的值包括:POST和Artifact。属性中的绑定顺序确定生成的元数据中端点的顺序。 | |
bindingsSLO | 要包含在Single Logout配置文件的元数据中的绑定。支持的值包括:POST和Redirect。属性中的绑定顺序确定生成的元数据中端点的顺序。 | POST, Redirect |
assertionConsumerIndex | 断言消费者指数的索引标记为默认值。 | 0 |
includeDiscoveryExtension | 当真实生成的元数据将包含指示它能够使用IDP发现服务的响应的扩展名时。 | false |
nameID | 要包含在元数据中的名称标识符。支持的值包括:EMAIL,TRANSIENT,PERSISTENT,UNSPECIFIED和X509_SUBJECT。属性中的NameID顺序确定生成的元数据中NameID的顺序。 | EMAIL, TRANSIENT, PERSISTENT, UNSPECIFIED, X509_SUBJECT |
extendedMetadata | 可以在ExtendedMetadata中指定其他设置,例如安全密钥,实体别名,元数据签名,IDP发现,ECP设置,安全配置文件和签名要求,有关详细信息,请参见第7.3节“扩展元数据”。 | no extended metadata |
如果entityBaseURL未指定属性,则将根据第一个HTTP请求中的值自动生成该属性。通过将normalizeBaseUrlMetadataGeneratorFilter的属性设置为,可以对生成的值进行规范化,以排除http / https方案的标准80/443端口true。建议在配置中明确提供值。
为属性bindingsSSO提供空集合或空值,bindingsHoKSSO和bindingsSLO 将禁用和删除给定的配置文件。例如,以下设置从生成的元数据中删除holder-of-key配置文件,强制单点登录的工件绑定和单点注销的重定向绑定:
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="bindingsSSO"><list><value>artifact</value></list></property>
<property name="bindingsSLO"><list><value>redirect</value></list></property>
<property name="bindingsHoKSSO"><list/></property>
</bean>
默认情况下,生成的元数据不会进行数字签名。数字签名可以使用属性启用 signMetadata的的extendedMetadata豆。
如果应用程序部署在反向代理或其他机制后面,这使得应用程序服务器上的URL与客户端看到的URL不同,至少entityBaseURL应将属性设置为值,例如https://www.server.com:8080 For有关负载平衡的详细信息,请参见第10.1节“反向代理和负载平衡器”。
7.1.2预配置的元数据
在某些情况下,提供元数据文档的静态版本而不是自动生成是有益的。其中一些需要手动更改元数据或修复生产设置。可以通过使用正确的ExtendedMetadata 更新元数据bean 来添加描述本地SP应用程序的自定义元数据文档。请按照以下步骤操作:
- 生成和下载元数据,例如使用元数据管理 - >在示例应用程序的管理UI中生成新的服务提供商元数据选项,或使用自动元数据生成器中的说明。
- 将元数据文件存储为项目类路径的一部分,例如在WEB-INF / classes / metadata / localhost_sp.xml中。
- 通过从securityContext.xml中删除以下自定义筛选器来禁用自动元数据生成器:
<security:custom-filter before="FIRST" ref="metadataGeneratorFilter"/>
- 在元数据 bean中包含SP元数据,并在扩展元数据中将实体标记为本地。确保 在元数据生成期间使用别名属性时指定别名属性。建议使用管理UI,该UI还生成准备包含在securityContext.xml中的所有Spring声明。预配置的本地元数据的配置可以看起来像这样:
<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.ClasspathResource"> <constructor-arg value="/metadata/localhost_sp.xml"/> </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="metaiop"/> <property name="sslSecurityProfile" value="pkix"/> <property name="signMetadata" value="true"/> <property name="signingKey" value="apollo"/> <property name="encryptionKey" value="apollo"/> <property name="requireArtifactResolveSigned" value="false"/> <property name="requireLogoutRequestSigned" value="false"/> <property name="requireLogoutResponseSigned" value="false"/> <property name="idpDiscoveryEnabled" value="true"/> <property name="idpDiscoveryURL" value="https://www.server.com:8080/context/saml/discovery"/> <property name="idpDiscoveryResponseURL" value="https://www.server.com:8080/context/saml/login?disco=true"/> </bean> </constructor-arg> </bean>
您的应用程序的同一实例可以包括多个静态声明的本地服务提供程序,每个服务提供程序由其自己的唯一别名和实体ID区分,有关详细信息,请参见第7.4节“多租户和实体别名”。如果您的应用程序定义多个本地服务提供商,设置属性hostedSPName的的元数据豆到一个默认的实体ID。
具有预配置元数据的文件不需要包含数字签名。当属性signMetadata设置为true时,元数据将在运行时自动签名。
有关ExtendedMetadata可用设置的详细信息,请参见第7.3节“扩展元数据”。
7.1.3下载元数据
可以从URL下载描述默认本地应用程序的元数据:
https://www.server.com:8080/context/saml/metadata
如果应用程序配置为包含多个服务提供者,则可以通过添加别名来加载每个服务提供者的元数据:
https://www.server.com:8080/context/saml/login/alias/defaultAlias
可以通过从securityContext.xml中删除过滤器metadataDisplayFilter来禁用元数据下载的URL 。
元数据在元数据信息 - >选定的SP下的示例应用程序的管理UI中也可用。
7.2身份提供者元数据
身份提供程序的元数据以与预配置的SP元数据类似的方式导入到metadataManager。可以通过提供URL或文件来添加包含一个或多个身份提供者的元数据。可以使用ExtendedMetadataDelegate和ExtendedMetadata的属性自定义元数据的处理和SAML消息的处理。
7.2.1基于文件的元数据提供程序
基于文件的提供程序从文件系统或类路径中可用的文件加载元数据。
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider">
<constructor-arg>
<value type="java.io.File">classpath:security/idp.xml</value>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"/>
</constructor-arg>
</bean>
元数据会在MetadataProvider bean的属性minRefreshDelay和maxRefreshDelay指定的时间间隔内自动刷新。
7.2.2基于HTTP的元数据提供程序
基于HTTP的提供程序从URL加载元数据。
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.HTTPMetadataProvider">
<constructor-arg>
<value type="java.lang.String">http://idp.ssocircle.com/idp-meta.xml</value>
</constructor-arg>
<constructor-arg>
<!-- Timeout for metadata loading in ms -->
<value type="int">5000</value>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"/>
</constructor-arg>
</bean>
元数据会在MetadataProvider bean的属性minRefreshDelay和maxRefreshDelay指定的时间间隔内自动刷新。
或者,类org.opensaml.saml2.metadata.provider.FileBackedHTTPMetadataProvider可用于提供备份,以防URL暂时不可用。要用作备份的文件在MetadataProvider bean构造函数中指定为第三个参数。
7.2.3使用SSL的基于HTTP的元数据提供程序
默认情况下,使用基于HTTP的提供程序通过HTTPS加载元数据会执行在JDK中配置的信任验证。如果您想在keyStore中使用证书,请添加以下bean以更改HTTP Client使用的socketFactory:
<bean class="org.springframework.security.saml.trust.httpclient.TLSProtocolConfigurer"/>
所述TLSProtocolConfigurer实例TLSProtocolSocketFactory和寄存器是作为默认套接字工厂用于元数据加载HTTP客户端内https协议。套接字工厂使用keyStore中存在的所有公共证书作为PKIX验证的信任锚。使用的密钥可以使用属性trustedKeys进行约束。
以这种方式配置的套接字工厂用于所有元数据提供程序。通过将配置的HttpClient实例添加到HTTPMetadataProvider构造函数,可以基于每个提供程序自定义元数据加载。
7.2.4元数据签名验证
导入数字签名的元数据需要验证签名的有效性和信任。默认情况下,不需要签署元数据。如果存在,则使用PKIX算法验证签名,并使用配置的keyManager中存在的所有公钥作为信任锚。确保包括根CA证书,并在您签名的中间CA证书的keyStore。有关详细信息,请参见第8.1.3节“导入公钥”。
您可以通过设置ExtendedMetadataDelegate bean的属性metadataTrustedKeys来限制用于执行验证的证书。提供的集合应包含要用作信任锚的密钥别名。
通过在ExtendedMetadataDelegate bean中将属性metadataTrustCheck设置为false,可以禁用签名验证。将metadataRequireSignature设置为true将拒绝元数据,除非它经过数字签名。
7.3扩展元数据
扩展元数据提供了自定义SP和IDP之间SAML交换的其他设置,这些设置在标准SAML 2.0元数据文档中不受支持。此类设置的示例是消息签名,IDP发现和安全配置文件的要求。
扩展元数据是使用 嵌入在ExtendedMetadataDelegate内的org.springframework.security.saml.metadata.ExtendedMetadata bean为每个SP或IDP元数据定义定义的。如果单个元数据文档包含多个身份提供者(在多个EntityDescriptor元素中),则可以使用实体ID作为键的地图为每个元数据单独设置扩展元数据,例如:
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
metadata provider bean
</constructor-arg>
<constructor-arg>
<!-- Default extended metadata for entities not specified in the map -->
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"/>
</constructor-arg>
<constructor-arg>
<!-- Extended metadata for specific IDPs -->
<map>
<entry key="http://idp.ssocircle.com">
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"/>
</entry>
</map>
</constructor-arg>
</bean>
下表总结了扩展元数据中可用的设置。同一类用于本地服务提供者和远程身份提供者; 每个值包含有关其有效实体的信息。
表7.2。扩展元数据设置
属性 | 默认 | 实体 | 描述 |
---|---|---|---|
local | false | local and remote | 对于本地服务提供商的元数据为True。远程身份提供者为假。 |
alias | local only | 用于根据使用的URL标识所选本地服务提供商的唯一别名。请参见第7.4节“多租户和实体别名”。 | |
signMetadata | false | local only | 使用带有别名的证书使用XML签名对真实生成的元数据进行签名signingKey 。 |
idpDiscoveryEnabled | false | local only | 当在SSO初始化期间未选择IDP时,真系统将初始化IDP发现。请参见第9.1节“IDP选择和发现”。 |
idpDiscoveryURL | internal discovery URL | local only | IDP发现服务的URL。仅在启用发现时使用。 |
idpDiscoveryResponseURL | internal discovery URL | local only | 期望来自IDP发现服务的响应的URL。仅在启用发现时使用。 |
ecpEnabled | false | local only | Property支持SAML 2.0 ECP配置文件。请参见第10.4节“增强的客户端/代理”。 |
securityProfile | metaiop | local only | 用于验证消息签名的安全配置文件。请参见第8.2节“安全配置文件”。 |
sslSecurityProfile | pkix | local only | 用于验证SSL / TLS端点信任的安全配置文件。请参见第8.2节“安全配置文件”。 |
sslHostnameVerification | default | local only | 验证HTTPS调用的主机名(例如,在工件解析中)。允许的值是default,defaultAndLocalhost, strict和allowAll。值allowAll 有效地禁用主机名验证。所有值都不区分大小写。有关支持的主机名验证的更多详细信息,请参阅 Commons-SSL JavaDoc。 |
signingAlgorithm | - | local only | 用于在元数据对象上创建数字签名的算法。典型值是http://www.w3.org/2000/09/xmldsig#rsa-sha1,http://www.w3.org/2001/04/xmldsig-more#rsa-sha256和HTTP:// WWW .w3.org / 2001/04 / xmldsig-more#rsa-sha512。 |
signingKey | - | local and remote | 对于用于创建签名的私钥的本地实体别名。如果未提供任何值,则使用默认私钥。对于远程身份提供程序,定义用于验证签名的其他公钥。 |
的encryptionKey | - | local and remote | 对于用于加密数据的私钥的本地实体别名。如果未提供任何值,则使用默认私钥。对于远程身份提供者,定义了用于解密数据的附加公钥。 |
tlsKey | - | local and remote | 对于用于SSL / TLS客户端身份验证的私钥的本地实体别名。未指定值时,不使用客户端身份验证。对于远程身份提供者,定义用于信任解析的附加公钥。 |
trustedKeys | - | remote | 在PKIX评估期间,密钥包含为可信锚。keyStore中的所有键都用作具有空值的信任锚。密钥仅用于PKIX安全配置文件。 |
requireLogoutRequestSigned | true | local and remote | 对于本地实体,可以要求签名注销请求。对于远程实体,可以签署发送给IDP的请求。 |
requireLogoutResponseSigned | false | local and remote | 对于本地实体,可以要求签名注销响应。对于远程实体,可以签署发送给IDP的响应。 |
requireArtifactResolveSigned | true | remote only | 允许签署发送到远程身份提供者的工件解析请求。 |
supportUnsolicitedResponse | true | remote only | 支持从此远程实体发送的未经请求的响应(IDP初始化的SSO)。 |
有关设置元数据和扩展元数据的其他示例,请参见本 节 SP的第7.1节“服务提供程序元数据” 和远程IDP的第7.2节“身份提供程序元数据”。
7.4多租户和实体别名
Spring SAML包含对多租户的有限支持。可以为本地服务提供商的多个实例定义配置,其中每个实例可以具有不同的URL和安全设置。System使用实体别名来区分服务提供者实例,实体别名是Spring SAML部署中的唯一标识符。
实体别名附加到SAML端点的URL,并由Spring SAML用于标识正确的实例。例如,对于具有实体别名 customer123的本地服务提供者,标准URL方案:// server:port / contextPath / saml / login变为 scheme:// server:port / contextPath / saml / login / alias / customer123。
实体别名功能只能与预先配置的元数据一起使用(请参见第7.1.2节“预配置的元数据”)。所述实体别名是在每个所配置的服务提供商的扩展的元数据指定。
Spring SAML不对Identity Provider向哪个本地服务提供商传递消息强制执行任何限制。如果您的应用程序需要类似的规则(例如,只有某些租户可以使用特定的IDP进行身份验证),请确保在SAMLUserDetailsService中实现它们(用于单点登录)。
在SAMLContextProviderImpl类中执行基于URL的正确Service Provider实例的选择。