【问题标题】:Sample SAML Java Config. Project, Broken From the Start示例 SAML Java 配置。项目,从一开始就破碎
【发布时间】:2015-11-14 13:56:55
【问题描述】:

我为 Spring 的 SAML 扩展引入了示例 Java configuration project。在我写下这个问题时,似乎已经有大约六个月没有对该项目进行任何提交。除了运行maven package 之外,我没有对这个项目做任何事情。

然后我在 Spring Tool Suite 中将应用程序作为 Spring Boot 应用程序运行,并且应用程序运行;但是,应用程序无法正常运行,并且应用程序端点不可访问(导致错误消息):“错误:身份验证过程出错”。

我还没有注册任何证书等(很可能需要)。 GitHub 项目没有提供有关启动或使用该应用程序的说明。我故意没有发布项目的内容,因为我没有修改它。

错误信息

来自 Chrome 开发者。工具,我可以看到从请求返回到localhost:8080 应用程序的500 Internal Server Error。所以,问题肯定出在示例应用程序上(或者我没有做过的事情)。

以下错误记录到控制台在应用程序部署中(我已经包含了图像和文本,因为文本很难格式化):

文字:

[2015-08-20 14:41:40.551] 启动 - 9908 信息 [localhost-startStop-1] --- HttpMethodDirector:处理时捕获的 I/O 异常 (javax.net.ssl.SSLPeerUnverifiedException) 请求:SSL 对等方的主机名验证失败:46.4.112.4
[2015-08-20 14:41:40.551] 启动 - 9908 INFO [localhost-startStop-1] --- HttpMethodDirector:重试请求
[2015-08-20 14:41:40.795] 启动 - 9908 错误 [localhost-startStop-1] --- HTTPMetadataProvider: 从 https://idp.ssocircle.com/idp-meta.xml 检索元数据时出错 javax.net.ssl.SSLPeerUnverifiedException:SSL 对等主机名失败 名称验证:46.4.112.4
在 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 更新包含的元数据”的描述;但是,其根源可能是上述错误。

问题

我是否遗漏了启动示例应用程序时显而易见的内容?换句话说,这个错误告诉我我需要调查什么?或者,因为它是“不间断的”,我应该忽略它吗?

我为什么要问

围绕示例 Java 配置应用程序部署的文档很少(如“不存在”)。自文档仅提供“提示”,例如:

 // 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 的运行之外,我在应用程序的部署中没有做任何事情。

【问题讨论】:

  • 我对 Spring SAML 完全陌生。欢迎任何帮助我改进问题的 cmets。

标签: java spring spring-security saml-2.0 spring-saml


【解决方案1】:

查看answer:它基本上描述了我最近发布的一个插件,它允许您以这种方式配置 Spring Boot 和 Spring Security 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 集成的演示应用

【讨论】:

  • 什么是 entityId ?在这里你定义了“localhost-demo”
【解决方案2】:

由于示例应用程序使用了已弃用的构造函数 - 已明确禁止警告的弃用构造函数 - 用于 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 配置的应用程序。需要采取所有步骤来“注册”元数据。应用程序将无法使用当前 Java 配置注册其元数据(见下文;第 2 点)
  2. 更改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 的配置和生成的元数据。

【讨论】:

  • 我尝试了以下几行,但仍然无法正常工作,您能帮忙吗?定时器 timer = new Timer(); HttpClient httpClient = new HttpClient(); HTTPMetadataProvider httpMetadataProvider = new HTTPMetadataProvider(timer, httpClient, "idp.ssocircle.com/idp-meta.xml");
  • 我得到“原因:无法进行单点登录或联合。”
  • @aProgrammer 是的。还有一些其他配置会影响示例 SAML 应用程序生成 ssocircle 可接受的元数据的能力(我不知道这是基于 ssocircle 没有正确解析还是 Spring 的 Java 配置产生错误的 XML - 我的倾向是它是后者)。稍后我将在 Microsoft Azure 上进行测试。此外,我使用的 HttpClient 是初始化为 @BeanMultiThreadConnectionManager 传递给其构造函数。
  • @aProgrammer 查看对上述答案的更改。
【解决方案3】:

只是一些提示:

我在尝试设置 HTTP-Artifact 配置文件时遇到了这个异常。

在 OpenSAML 尝试创建套接字以连接到其他主机之前,org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory (openws-1.5.1) 中有一个 hostnameVerifier 和一个 verifyHostname() 处理。

我在org.springframework.security.saml.metadata.ExtendedMetadata 中将sslHostnameVerification 配置为“allowAll”,允许的值为“default”、“defaultAndLocalhost”、“strict”和“allowAll”。

在您的情况下,当 SP(您的 saml 示例)尝试从 IdP(ssocircle)下载 metadata.xml 时,引发了此异常。弄清楚发生了什么的最好方法是调试 hostnameVerifier 的设置时间和位置。

或者您可以尝试在SSOCircle的ExtendedMetadataDelegate的ExtendedMetadata中将sslHostnameVerification设置为“allowAll”先试一试..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2021-04-05
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多