Загрузка метаданных из https с помощью Spring SAML
Я хотел бы импортировать некоторые метаданные из интернета, используя протоколhttps :
@Bean
public HTTPMetadataProvider ssoCircleMetadataProvider()
throws MetadataProviderException {
String metadataURL = "https://idp.ssocircle.com/idp-meta.xml";
final Timer backgroundTaskTimer = new Timer(true);
HTTPMetadataProvider provider = new HTTPMetadataProvider(
backgroundTaskTimer, httpClient(), metadataURL);
provider.setParserPool(parserPool());
return provider;
}
Прочитав документацию , я нашел этот шаг:
По умолчанию загрузка метаданных через HTTP-провайдер HTTPS выполняет проверку доверия, настроенную в вашем JDK. В случае если вы хотите использовать сертификаты в хранилище ключей, добавьте следующее боб, который изменяет socketFactory, используемый HTTP Клиент:
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="org.apache.commons.httpclient.protocol.Protocol"/>
<property name="targetMethod" value="registerProtocol"/>
<property name="arguments">
<list>
<value>https</value>
<bean class="org.apache.commons.httpclient.protocol.Protocol">
<constructor-arg value="https"/>
<constructor-arg>
<bean class="org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory"/>
</constructor-arg>
<constructor-arg value="443"/>
</bean>
</list>
</property>
</bean>
Преобразуя в Java Config, он становится:
@Bean
public Protocol httpClientProtocol() {
org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory factory =
new org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory();
Protocol httpClientProtocol = new Protocol ("https", factory, 443);
return httpClientProtocol;
}
@Bean
public MethodInvokingFactoryBean methodInvokingFactoryBean() {
MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
methodInvokingFactoryBean.setTargetClass(Protocol.class);
methodInvokingFactoryBean.setTargetMethod("registerProtocol");
Object[] args = {"https", httpClientProtocol()};
methodInvokingFactoryBean.setArguments(args);
return methodInvokingFactoryBean;
}
Но класс org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory
результатов не нашел. Я использую версию 1.0.0-RC2
из Spring SAML.
Я делаю что-то не так?
Как я могу исправить эту ошибку и загрузить метаданные по своему усмотрению?
Обновить
Используя хранилище моментальных снимков, я могу использовать класс TLSProtocolSocketFactory. Я импортировал в свое хранилище ключей сертификат SSOCircle, но несмотря на это таким образом, приложение возвращает ошибку следующим образом:
[2014-07-31 17:33:27.596] boot - 11800 ERROR [localhost-startStop-1] --- HTTPMetadataProvider: Error retrieving metadata from https://idp.ssocircle.com/idp-meta.xml
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Обновление 2
Я исправил свой код в соответствии с вашим предложением. Я импортировал все сертификаты в хранилище ключей, но при загрузке приложение возвращает эту ошибку:
[2014-08-01 10:02:38.961] boot - 14704 DEBUG [localhost-startStop-1] --- BasicX509CredentialNameEvaluator: Supplied trusted names are null or empty, skipping name evaluation
[2014-08-01 10:02:38.962] boot - 14704 DEBUG [localhost-startStop-1] --- MetadataCredentialResolver: Attempting PKIX path validation on untrusted credential: [subjectName='CN=ADFS Signing - ststest-vdenotarisnet.vdenotaris.it']
[2014-08-01 10:02:39.028] boot - 14704 ERROR [localhost-startStop-1] --- MetadataCredentialResolver: PKIX path construction failed for untrusted credential: [subjectName='CN=ADFS Signing - ststest-vdenotarisnet.vdenotaris.it']: unable to find valid certification path to requested target
[2014-08-01 10:02:39.028] boot - 14704 DEBUG [localhost-startStop-1] --- PKIXSignatureTrustEngine: Signature trust could not be established via PKIX validation of signing credential
[2014-08-01 10:02:39.028] boot - 14704 DEBUG [localhost-startStop-1] --- BaseSignatureTrustEngine: Failed to establish trust of KeyInfo-derived credential
[2014-08-01 10:02:39.028] boot - 14704 DEBUG [localhost-startStop-1] --- BaseSignatureTrustEngine: Failed to verify signature and/or establish trust using any KeyInfo-derived credentials
[2014-08-01 10:02:39.029] boot - 14704 DEBUG [localhost-startStop-1] --- PKIXSignatureTrustEngine: PKIX validation of signature failed, unable to resolve valid and trusted signing key
[2014-08-01 10:02:39.029] boot - 14704 ERROR [localhost-startStop-1] --- SignatureValidationFilter: Signature trust establishment failed for metadata entry http://ststest.vdenotaris.local/adfs/services/trust
[2014-08-01 10:02:39.031] boot - 14704 ERROR [localhost-startStop-1] --- AbstractReloadingMetadataProvider: Error filtering metadata from https://ststest.vdenotaris.local/FederationMetadata/2007-06/FederationMetadata.xml
org.opensaml.saml2.metadata.provider.FilterException: Signature trust establishment failed for metadata entry
Обратите внимание, что используемый сертификат проверяется GoDaddy.1 ответ:
Класс
TLSProtocolSocketFactory
доступен только в магистрали и будет частью 1.0.0.ОКОНЧАТЕЛЬНЫЙ. Единственный выбор в RC2-это добавить ключи в хранилище ключей JDK.Обновление:
Версии моментальных снимков Spring SAML доступны в этом репозитории:
<repository> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> <id>com.springsource.repository.maven.snapshot</id> <name>SpringSource Enterprise Bundle Maven Repository - SpringSource Snapshot Releases</name> <url>http://maven.springframework.org/snapshot</url> </repository>
Возможно, вы захотите прочитать главу "Что нового", в которой перечислены изменения, произошедшие после RC2, некоторые из них имеют последствия для обратной совместимости.
Еще одно обновление:
Ваша инициализация неверна, TLSFactory должен быть запущен как Боб, вам, вероятно, также нужна зависимость в MetadataManager.
@Bean public ProtocolSocketFactory socketFactory() { return new TLSProtocolSocketFactory(); } @Bean public Protocol socketFactoryProtocol() { return new Protocol("https", socketFactory(), 443); } @Bean public MethodInvokingFactoryBean socketFactoryInitialization() { MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean(); methodInvokingFactoryBean.setTargetClass(Protocol.class); methodInvokingFactoryBean.setTargetMethod("registerProtocol"); Object[] args = {"https", socketFactoryProtocol()}; methodInvokingFactoryBean.setArguments(args); return methodInvokingFactoryBean; } @Bean @Qualifier("metadata") @DependsOn("socketFactoryInitialization") public CachingMetadataManager metadata() throws MetadataProviderException, IOException { ... }