示例 SAML Java 配置。项目,从一开始就坏了
Sample SAML Java Config. Project, Broken From the Start
我为 Spring 的 SAML 扩展引入了示例 Java configuration project。在我写这个问题时,大约六个月内似乎没有对该项目做出任何承诺。除了 运行 maven package
反对它之外,我没有对这个项目做任何事情。
然后我 运行 Spring 工具套件中的应用程序作为 Spring 启动应用程序和应用程序 运行s;然而,应用程序并非 运行 没有错误,应用程序端点不可访问(导致错误消息):"ERROR: Something went wrong in the authentication process".
我还没有注册任何证书等(可能非常需要)。 GitHub 项目没有提供启动或使用该应用程序的说明。我故意没有发布项目的内容,因为我没有修改它。
关于错误的信息
来自 Chrome 开发者。工具,我可以看到 500 Internal Server Error
从请求返回到 localhost:8080
应用程序。因此,问题肯定出在示例应用程序(或我没有做过的事情)上。
以下错误记录到控制台应用程序部署(我已经包含了图像和文本,因为文本被证明难以格式化):
文本:
[2015-08-20 14:41:40.551] boot - 9908 INFO [localhost-startStop-1]
--- HttpMethodDirector: I/O exception (javax.net.ssl.SSLPeerUnverifiedException) caught when processing
request: SSL peer failed hostname validation for name: 46.4.112.4
[2015-08-20 14:41:40.551] boot - 9908 INFO [localhost-startStop-1]
--- HttpMethodDirector: Retrying request
[2015-08-20 14:41:40.795] boot - 9908 ERROR [localhost-startStop-1] --- HTTPMetadataProvider:
Error retrieving metadata from https://idp.ssocircle.com/idp-meta.xml
javax.net.ssl.SSLPeerUnverifiedException: SSL peer failed hostname
validation for name: 46.4.112.4
at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.verifyHostname(TLSProtocolSocketFactory.java:233)
at
org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.createSocket(TLSProtocolSocketFactory.java:194)
我已经访问了 ssocircle 提供的 url 端点并且元数据被公开了。
如果我访问服务提供商的 /saml/metadata
端点并获得一些有用的信息:一个 org.opensaml.saml2.metadata.provider.MetadataProviderException
异常。如果是 "No IDP was configured, please update included metadata with at least one IDP" 的描述;但是,其来源可能是上述错误。
问题
我是否遗漏了启动示例应用程序时显而易见的内容?换句话说,这个错误告诉我需要调查什么?或者,因为它是 "non-breaking",我是否忽略它?
我为什么要问
关于示例 Java 配置应用程序部署的文档很少(如 "non-existant" 中)。自文档仅提供"hints",例如:
// IDP Metadata configuration - paths to metadata of IDPs in circle of trust is here
// Do no forget to call initialize method on providers
@Bean
@Qualifier("metadata")
public CachingMetadataManager metadata() throws MetadataProviderException {
List<MetadataProvider> providers = new ArrayList<MetadataProvider>();
providers.add(ssoCircleExtendedMetadataProvider());
return new CachingMetadataManager(providers);
}
我确定有些事情我没有做,特别是因为除了上面描述的 mvn package
的 运行 之外,我在应用程序的部署中没有做任何事情。
只是一些提示:
我在尝试设置 HTTP-Artifact 配置文件时遇到了这个异常。
在 org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory
(openws-1.5.1) 中有一个 hostnameVerifier 和一个 verifyHostname()
在 OpenSAML 尝试创建套接字以连接到其他主机之前的处理。
我在org.springframework.security.saml.metadata.ExtendedMetadata
中将sslHostnameVerification
配置为"allowAll",允许的值为"default"、"defaultAndLocalhost"、"strict"和"allowAll"。
在你的情况下,当 SP(你的 saml 样本)试图从 IdP(ssocircle)下载 metadata.xml 时,抛出了这个异常。弄清楚发生了什么的最好方法是调试设置 hostnameVerifier
的时间和位置。
或者您可以尝试在 SSOCircle 的 ExtendedMetadataDelegate 的 ExtendedMetadata 中将 sslHostnameVerification 设置为 "allowAll" 以先尝试..
问题的发生是由于示例应用程序使用了已弃用的构造函数 - 其警告被明确禁止的弃用 - HTTPMetadataProvider
(我将很快提交修复)。在配置 ExtendedMetadataDelegate
时,使用了 two-parametered constructor:
@Bean
@Qualifier("idp-ssocircle")
public ExtendedMetadataDelegate ssoCircleExtendedMetadataProvider() throws MetadataProviderException {
@SuppressWarnings({ "deprecation"})
HTTPMetadataProvider httpMetadataProvider = new HTTPMetadataProvider("https://idp.ssocircle.com/idp-meta.xml", 5000);
// other config.s...
}
如果替换为采用 java.util.Timer
和 org.apache.commons.httpclient.HttpClient
(除了元数据 url)的未弃用的构造函数,示例应用程序可以正常工作,并且不会记录错误。
其他与 OP 无关的信息
我必须执行以下操作才能将示例 SAML 应用程序下载到 运行
删除弃用的构造函数后,我建议做两件事:
- 按照 4.2.6 of the documentation 中概述的步骤进行操作,即在设置期间将应用程序视为 XML 配置的应用程序。 "register" 元数据需要执行所有步骤。应用程序将无法使用当前 Java 配置注册其元数据(见下文;第 2 点)
- 更改 class
WebSecurityConfig
中的默认配置(阅读下面的详细信息)
配置更改
在 ExtendedMetadataDelegate
bean ssoCircleExtendedMetadataProvider
的配置中,更改 ExtendedMetadataDelegate
的 属性 值如下:
// code....
extendedMetadataDelegate.setMetadataTrustCheck(true);
extendedMetadataDelegate.setMetadataRequireSignature(false);
// code....
在 ExtendedMetadata
bean(与上面不同)中,更改 属性 值如下:
// code....
extendedMetadata.setIdpDiscoveryEnabled(true);
extendedMetadata.setSignMetadata(false);
// code....
"Disclaimer"
是否应该在生产中使用,我不知道;然而,它似乎更好地反映了基于 XML 的配置和在 SAML Spring Documentation
中引用的 XML 配置的服务提供商示例的结果元数据
查看此 answer:它基本上描述了我最近发布的一个插件,允许您以这种方式配置 Spring 引导和 Spring 安全 SAML:
@SpringBootApplication
@EnableSAMLSSO
public class SpringBootSecuritySAMLDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootSecuritySAMLDemoApplication.class, args);
}
@Configuration
public static class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
}
@Configuration
public static class MyServiceProviderConfig extends ServiceProviderConfigurerAdapter {
@Override
public void configure(ServiceProviderSecurityBuilder serviceProvider) throws Exception {
serviceProvider
.metadataGenerator()
.entityId("localhost-demo")
.and()
.sso()
.defaultSuccessURL("/home")
.idpSelectionPageURL("/idpselection")
.and()
.logout()
.defaultTargetURL("/")
.and()
.metadataManager()
.metadataLocations("classpath:/idp-ssocircle.xml")
.refreshCheckInterval(0)
.and()
.extendedMetadata()
.idpDiscoveryEnabled(true)
.and()
.keyManager()
.privateKeyDERLocation("classpath:/localhost.key.der")
.publicKeyPEMLocation("classpath:/localhost.cert");
}
}
}
有几个与 SSO Circle 集成的演示应用程序
我为 Spring 的 SAML 扩展引入了示例 Java configuration project。在我写这个问题时,大约六个月内似乎没有对该项目做出任何承诺。除了 运行 maven package
反对它之外,我没有对这个项目做任何事情。
然后我 运行 Spring 工具套件中的应用程序作为 Spring 启动应用程序和应用程序 运行s;然而,应用程序并非 运行 没有错误,应用程序端点不可访问(导致错误消息):"ERROR: Something went wrong in the authentication process".
我还没有注册任何证书等(可能非常需要)。 GitHub 项目没有提供启动或使用该应用程序的说明。我故意没有发布项目的内容,因为我没有修改它。
关于错误的信息
来自 Chrome 开发者。工具,我可以看到 500 Internal Server Error
从请求返回到 localhost:8080
应用程序。因此,问题肯定出在示例应用程序(或我没有做过的事情)上。
以下错误记录到控制台应用程序部署(我已经包含了图像和文本,因为文本被证明难以格式化):
文本:
[2015-08-20 14:41:40.551] boot - 9908 INFO [localhost-startStop-1] --- HttpMethodDirector: I/O exception (javax.net.ssl.SSLPeerUnverifiedException) caught when processing request: SSL peer failed hostname validation for name: 46.4.112.4
[2015-08-20 14:41:40.551] boot - 9908 INFO [localhost-startStop-1] --- HttpMethodDirector: Retrying request
[2015-08-20 14:41:40.795] boot - 9908 ERROR [localhost-startStop-1] --- HTTPMetadataProvider: Error retrieving metadata from https://idp.ssocircle.com/idp-meta.xml javax.net.ssl.SSLPeerUnverifiedException: SSL peer failed hostname validation for name: 46.4.112.4
at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.verifyHostname(TLSProtocolSocketFactory.java:233)
at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.createSocket(TLSProtocolSocketFactory.java:194)
我已经访问了 ssocircle 提供的 url 端点并且元数据被公开了。
如果我访问服务提供商的 /saml/metadata
端点并获得一些有用的信息:一个 org.opensaml.saml2.metadata.provider.MetadataProviderException
异常。如果是 "No IDP was configured, please update included metadata with at least one IDP" 的描述;但是,其来源可能是上述错误。
问题
我是否遗漏了启动示例应用程序时显而易见的内容?换句话说,这个错误告诉我需要调查什么?或者,因为它是 "non-breaking",我是否忽略它?
我为什么要问
关于示例 Java 配置应用程序部署的文档很少(如 "non-existant" 中)。自文档仅提供"hints",例如:
// IDP Metadata configuration - paths to metadata of IDPs in circle of trust is here
// Do no forget to call initialize method on providers
@Bean
@Qualifier("metadata")
public CachingMetadataManager metadata() throws MetadataProviderException {
List<MetadataProvider> providers = new ArrayList<MetadataProvider>();
providers.add(ssoCircleExtendedMetadataProvider());
return new CachingMetadataManager(providers);
}
我确定有些事情我没有做,特别是因为除了上面描述的 mvn package
的 运行 之外,我在应用程序的部署中没有做任何事情。
只是一些提示:
我在尝试设置 HTTP-Artifact 配置文件时遇到了这个异常。
在 org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory
(openws-1.5.1) 中有一个 hostnameVerifier 和一个 verifyHostname()
在 OpenSAML 尝试创建套接字以连接到其他主机之前的处理。
我在org.springframework.security.saml.metadata.ExtendedMetadata
中将sslHostnameVerification
配置为"allowAll",允许的值为"default"、"defaultAndLocalhost"、"strict"和"allowAll"。
在你的情况下,当 SP(你的 saml 样本)试图从 IdP(ssocircle)下载 metadata.xml 时,抛出了这个异常。弄清楚发生了什么的最好方法是调试设置 hostnameVerifier
的时间和位置。
或者您可以尝试在 SSOCircle 的 ExtendedMetadataDelegate 的 ExtendedMetadata 中将 sslHostnameVerification 设置为 "allowAll" 以先尝试..
问题的发生是由于示例应用程序使用了已弃用的构造函数 - 其警告被明确禁止的弃用 - HTTPMetadataProvider
(我将很快提交修复)。在配置 ExtendedMetadataDelegate
时,使用了 two-parametered constructor:
@Bean
@Qualifier("idp-ssocircle")
public ExtendedMetadataDelegate ssoCircleExtendedMetadataProvider() throws MetadataProviderException {
@SuppressWarnings({ "deprecation"})
HTTPMetadataProvider httpMetadataProvider = new HTTPMetadataProvider("https://idp.ssocircle.com/idp-meta.xml", 5000);
// other config.s...
}
如果替换为采用 java.util.Timer
和 org.apache.commons.httpclient.HttpClient
(除了元数据 url)的未弃用的构造函数,示例应用程序可以正常工作,并且不会记录错误。
其他与 OP 无关的信息
我必须执行以下操作才能将示例 SAML 应用程序下载到 运行
删除弃用的构造函数后,我建议做两件事:
- 按照 4.2.6 of the documentation 中概述的步骤进行操作,即在设置期间将应用程序视为 XML 配置的应用程序。 "register" 元数据需要执行所有步骤。应用程序将无法使用当前 Java 配置注册其元数据(见下文;第 2 点)
- 更改 class
WebSecurityConfig
中的默认配置(阅读下面的详细信息)
配置更改
在 ExtendedMetadataDelegate
bean ssoCircleExtendedMetadataProvider
的配置中,更改 ExtendedMetadataDelegate
的 属性 值如下:
// code....
extendedMetadataDelegate.setMetadataTrustCheck(true);
extendedMetadataDelegate.setMetadataRequireSignature(false);
// code....
在 ExtendedMetadata
bean(与上面不同)中,更改 属性 值如下:
// code....
extendedMetadata.setIdpDiscoveryEnabled(true);
extendedMetadata.setSignMetadata(false);
// code....
"Disclaimer"
是否应该在生产中使用,我不知道;然而,它似乎更好地反映了基于 XML 的配置和在 SAML Spring Documentation
中引用的 XML 配置的服务提供商示例的结果元数据查看此 answer:它基本上描述了我最近发布的一个插件,允许您以这种方式配置 Spring 引导和 Spring 安全 SAML:
@SpringBootApplication
@EnableSAMLSSO
public class SpringBootSecuritySAMLDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootSecuritySAMLDemoApplication.class, args);
}
@Configuration
public static class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
}
@Configuration
public static class MyServiceProviderConfig extends ServiceProviderConfigurerAdapter {
@Override
public void configure(ServiceProviderSecurityBuilder serviceProvider) throws Exception {
serviceProvider
.metadataGenerator()
.entityId("localhost-demo")
.and()
.sso()
.defaultSuccessURL("/home")
.idpSelectionPageURL("/idpselection")
.and()
.logout()
.defaultTargetURL("/")
.and()
.metadataManager()
.metadataLocations("classpath:/idp-ssocircle.xml")
.refreshCheckInterval(0)
.and()
.extendedMetadata()
.idpDiscoveryEnabled(true)
.and()
.keyManager()
.privateKeyDERLocation("classpath:/localhost.key.der")
.publicKeyPEMLocation("classpath:/localhost.cert");
}
}
}
有几个与 SSO Circle 集成的演示应用程序