示例 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.Timerorg.apache.commons.httpclient.HttpClient(除了元数据 url)的未弃用的构造函数,示例应用程序可以正常工作,并且不会记录错误。

其他与 OP 无关的信息

我必须执行以下操作才能将示例 SAML 应用程序下载到 运行

删除弃用的构造函数后,我建议做两件事:

  1. 按照 4.2.6 of the documentation 中概述的步骤进行操作,即在设置期间将应用程序视为 XML 配置的应用程序。 "register" 元数据需要执行所有步骤。应用程序将无法使用当前 Java 配置注册其元数据(见下文;第 2 点)
  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 集成的演示应用程序