我为Spring的SAML扩展提供了示例Java configuration project。在我写这个问题时,似乎没有对该项目做出约六个月的承诺。除了针对它运行maven package
之外,我没有对这个项目做过任何事情。
然后我在Spring Tool Suite中运行应用程序作为Spring Boot应用程序并运行应用程序;但是,应用程序不会在没有错误的情况下运行,并且应用程序端点无法访问(导致错误消息):“错误:在身份验证过程中出现问题”。
我没有注册任何证书等(可能非常需要)。 GitHub项目没有提供启动或使用该应用程序的说明。我故意没有发布项目的内容,因为我没有修改它。
来自Chrome Dev。工具,我可以看到从500 Internal Server Error
应用程序请求返回的localhost:8080
。所以,问题肯定在于示例应用程序(或者我没有做过的事情)。
在应用程序部署上将以下错误记录到控制台(我已经包含了图像和文本,因为文本很难格式化):
文字:
[2015-08-20 14:41:40.551] boot - 9908 INFO [localhost-startStop-1] --- HttpMethodDirector:处理时捕获的I / O异常(javax.net.ssl.SSLPeerUnverifiedException) 请求:SSL对等失败主机名验证名称:46.4.112.4
[2015-08-20 14:41:40.551] boot - 9908 INFO [localhost-startStop-1] --- HttpMethodDirector:重试请求
[2015-08-20 14:41:40.795] boot - 9908 ERROR [localhost-startStop-1] --- HTTPMetadataProvider: 从https://idp.ssocircle.com/idp-meta.xml检索元数据时出错 javax.net.ssl.SSLPeerUnverifiedException:SSL对等方失败的主机名 名称验证:46.4.112.4
at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.verifyHostname(TLSProtocolSocketFactory.java:233)
在 org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.createSocket(TLSProtocolSocketFactory.java:194)
我访问了ssocircle提供的url端点,并公开了元数据。
如果我访问服务提供商的/saml/metadata
端点并获得一些有用的信息:org.opensaml.saml2.metadata.provider.MetadataProviderException
例外。描述是否“未配置IDP,请更新包含至少一个IDP的元数据”;然而,这可能是上述错误的来源。
我是否遗漏了启动示例应用程序时显而易见的内容?换句话说,这个错误告诉我我需要调查什么?或者,因为它是“非破坏性的”,我会忽略它吗?
有关Sample Java Configuration应用程序部署的文档很少(如“不存在”)。自我文档仅提供“提示”,如下所示:
// 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
的运行。
答案 0 :(得分:1)
由于示例应用程序使用了不推荐使用的构造函数(对于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
的非弃用构造函数(除了元数据网址),示例应用程序也能正常工作,并且不会记录任何错误。
我必须执行以下操作才能运行示例SAML应用
删除不推荐使用的构造函数后,我建议做两件事:
WebSecurityConfig
中的默认配置(详见下方)配置更改
在ExtendedMetadataDelegate
bean ssoCircleExtendedMetadataProvider
的配置中,更改ExtendedMetadataDelegate
的属性值,如下所示:
// code....
extendedMetadataDelegate.setMetadataTrustCheck(true);
extendedMetadataDelegate.setMetadataRequireSignature(false);
// code....
在ExtendedMetadata
bean(与上面不同)中,更改属性值如下:
// code....
extendedMetadata.setIdpDiscoveryEnabled(true);
extendedMetadata.setSignMetadata(false);
// code....
这是否应该用于生产,我不知道;但是,它似乎更好地反映了SAML Spring Documentation
中引用的XML配置的服务提供者示例的基于XML的配置和结果元数据答案 1 :(得分:0)
只是一些提示:
我在尝试设置HTTP-Artifact配置文件时遇到了此异常。
在org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory
(openws-1.5.1)中有一个hostnameVerifier,在OpenSAML尝试创建套接字以连接到其他主机之前进行verifyHostname()
处理。
我在sslHostnameVerification
中将org.springframework.security.saml.metadata.ExtendedMetadata
配置为“allowAll”,允许的值为“default”,“defaultAndLocalhost”,“strict”和“allowAll”。
在您的情况下,当SP(您的saml示例)尝试从IdP(ssocircle)下载 metadata.xml 时,会抛出此异常。弄清楚发生了什么的最好方法是调试设置hostnameVerifier
的时间和地点。
或者您可以尝试在SSOCircle的ExtendedMetadataDelegate的ExtendedMetadata中将sslHostnameVerification设置为“allowAll”以首先尝试...
答案 2 :(得分:0)
checkout this answer:它基本上描述了我最近发布的一个插件,它允许你以这种方式配置Spring Boot和Spring Security SAML:
SequentialExample
有几个Demo应用程序与SSO Circle集成