Образец SAML Java Config. Проект, сломанный с самого начала

Я использовал пример Конфигурация Java проект для расширения SAML Spring. Похоже, что на момент написания этого вопроса в проекте не было никаких коммитов в течение примерно шести месяцев. Я ничего не сделал с этим проектом, кроме того, что maven package выступил против него.

Затем я запускаю приложение в Spring Tool Suite как приложение Spring Boot, и приложение запускается; однако приложение не запускается без ошибок, и конечная точка приложения недоступна (в результате появляется сообщение об ошибке): «ОШИБКА: что-то пошло не так в процессе аутентификации».

Я не зарегистрировал никаких сертификатов и т. Д. (И, возможно, это понадобится). В проекте GitHub нет инструкций по запуску или работе с приложением. Я намеренно не публиковал подробности проекта, так как оставил его без изменений.

ИНФОРМАЦИЯ ОБ ОШИБКЕ

Из Chrome Dev. Инструменты, я вижу 500 Internal Server Error, возвращенный из запроса к localhost:8080 приложению. Итак, проблема определенно связана с образцом приложения (или чем-то, что я еще не делал).

Следующая ошибка регистрируется в консоли при развертывании приложения (я включил и изображение, и текст, поскольку текст оказывается трудно форматировать):

Ошибка записана в консоль

Текст:

[2015-08-20 14: 41: 40.551] загрузка - 9908 INFO [localhost-startStop-1] --- HttpMethodDirector: исключение ввода-вывода (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 ОШИБКА [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 (TLSProtocolSocketFac tory.java:194)

Я посетил конечную точку URL, предоставленную ssocircle, и метаданные доступны.

Если я посещаю /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, описанного выше.


person Thomas    schedule 20.08.2015    source источник
comment
Я совершенно не знаком с Spring SAML. Любые комментарии, которые помогут мне улучшить вопрос, приветствуются.   -  person Thomas    schedule 20.08.2015


Ответы (3)


Проблема возникает из-за использования в примере приложения устаревшего конструктора - устаревшего, предупреждение которого было явно подавлено - для HTTPMetadataProvider (исправление, которое я зафиксирую в ближайшее время). При настройке ExtendedMetadataDelegate двухпараметрический конструктор:

    @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-приложения

После удаления устаревшего конструктора я рекомендую сделать две вещи:

  1. Выполните действия, описанные в 4.2.6 документации, т.е. обрабатывать приложение во время установки как приложение, настроенное для XML. Необходимо предпринять все шаги, чтобы «зарегистрировать» метаду. Приложение не сможет зарегистрировать свои метаданные в текущей конфигурации Java (см. Ниже; пункт 2)
  2. Измените конфигурации по умолчанию в классе WebSecurityConfig (подробности читайте ниже)

Изменение конфигурации

В конфигурации ExtendedMetadataDelegate bean ssoCircleExtendedMetadataProvider измените значения свойств ExtendedMetadataDelegate следующим образом:

// code....
extendedMetadataDelegate.setMetadataTrustCheck(true);
extendedMetadataDelegate.setMetadataRequireSignature(false);
// code....

В bean-компоненте ExtendedMetadata (отличном от указанного выше) измените значения свойств, как показано ниже:

// code....
extendedMetadata.setIdpDiscoveryEnabled(true); 
extendedMetadata.setSignMetadata(false);
// code....

"Заявление об ограничении ответственности"

Я не знаю, следует ли это использовать в продакшене; однако, похоже, он лучше отражает как конфигурацию на основе XML, так и результирующие метаданные примера поставщика услуг, сконфигурированного с помощью XML, упомянутого в Документация SAML Spring

person Thomas    schedule 24.08.2015
comment
Я пробовал строки ниже, но он все еще не работает, вы можете помочь? Таймер таймера = новый Таймер (); HttpClient httpClient = новый HttpClient (); HTTPMetadataProvider httpMetadataProvider = новый HTTPMetadataProvider (таймер, httpClient, idp.ssocircle.com/idp-meta.xml < / а>); - person Amit; 25.08.2015
comment
Я получаю причину: невозможно выполнить единый вход или федерацию. - person Amit; 25.08.2015
comment
@aProgrammer да. Существуют и другие конфигурации, которые влияют на способность образца SAML-приложения создавать метаданные, приемлемые для ssocircle (я не знаю, основано ли это на неправильном синтаксическом анализе ssocircle или на конфигурации Java Spring, создающей плохой XML - я склоняюсь к тому, что это это последнее). Позже собираюсь протестировать в Microsoft Azure. Кроме того, HttpClient, который я использую, инициализируется как @Bean с MultiThreadConnectionManager, переданным его конструктору. - person Thomas; 25.08.2015
comment
@aProgrammer ознакомьтесь с изменениями в приведенном выше ответе. - person Thomas; 25.08.2015

Советы:

Я встретил это исключение, когда пытался настроить профиль HTTP-Artifact.

В org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory (openws-1.5.1) есть hostnameVerifier и обработка verifyHostname() перед тем, как OpenSAML попытается создать сокет для подключения к другому хосту.

Я настроил sslHostnameVerification на "allowAll" в org.springframework.security.saml.metadata.ExtendedMetadata, допустимые значения: "default", "defaultAndLocalhost", "strict" и "allowAll".

Похоже, что в вашем случае это исключение было вызвано, когда SP (ваш образец saml) пытался загрузить metadata.xml из IdP (ssocircle). Лучший способ выяснить, что происходит, - это отладить, когда и где был установлен hostnameVerifier.

Или вы можете попробовать установить sslHostnameVerification на «allowAll» в ExtendedMetadata SSOCircle's ExtendedMetadataDelegate, чтобы сначала попробовать ..

person Liu Xingnan    schedule 21.08.2015

ознакомьтесь с этим ответом: он в основном описывает недавно выпущенный мной плагин, который позволяет вам настроить 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.

person Ulises    schedule 23.05.2016
comment
Что такое entityId? здесь вы определили localhost-demo - person rogue lad; 29.08.2017