Я сделал все, как описано в spring saml tutorial, за исключением того, что я добавляюHTTP Status 401 - Ошибка аутентификации: Ошибка декодирования входящего SAML сообщение
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>1.4.01</version>
</dependency>
в pom.xml преодолеть w3.dom класс не найден проблемы. Когда я запускаю образец проекта, я получил HTTP Status 401 - Authentication Failed: Error decoding incoming SAML message
в браузере, и в то же время (CertPathPKIXTrustEvaluator.java:81) ERROR org.springframework.security.saml.trust.MetadataCredentialResolver - PKIX path construction failed for untrusted credential: [subjectName='CN=idp.ssocircle.com' |credential entityID='https://idp.ssocircle.com']: unable to find valid certification path to requested target
в консоли.
ДЕНЬ 2: Я побежал keytool -importcert -alias identtrustca -file ca.cer -keystore samlKeystore.jks
и заменить security/samlKeystore.jks
с новым генерируемым. securityContext.xml
:
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
<constructor-arg value="classpath:security/samlKeystore.jks"/>
<constructor-arg type="java.lang.String" value="nalle123"/>
<constructor-arg>
<map>
<entry key="apollo" value="nalle123"/>
</map>
</constructor-arg>
<constructor-arg type="java.lang.String" value="apollo"/>
</bean>
Тогда у меня есть:
Caused by: java.io.IOException: Keystore was tampered with, or password was incorrect
at sun.security.provider.JavaKeyStore.engineLoad(Unknown Source)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(Unknown Source)
at java.security.KeyStore.load(Unknown Source)
at org.springframework.security.saml.key.JKSKeyManager.initialize(JKSKeyManager.java:117)
... 57 more
Caused by: java.security.UnrecoverableKeyException: Password verification failed
... 61 more
Тогда я изменить пароль с той, которую я вступил, когда использование keytool
:
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
<constructor-arg value="classpath:security/samlKeystore.jks"/>
<constructor-arg type="java.lang.String" value="123456"/>
<constructor-arg>
<map>
<entry key="apollo" value="123456"/>
</map>
</constructor-arg>
<constructor-arg type="java.lang.String" value="apollo"/>
</bean>
Тогда консоль говорит:
Servlet.service() for servlet [jsp] in context with path [/spring-security-saml2-sample] threw exception
java.lang.RuntimeException: Key for alias apollo not found
at org.springframework.security.saml.metadata.MetadataGenerator.getServerKeyInfo(MetadataGenerator.java:201)
Так что я изменить apollo
к identtrustca
:
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
<constructor-arg value="classpath:security/samlKeystore.jks"/>
<constructor-arg type="java.lang.String" value="123456"/>
<constructor-arg>
<map>
<entry key="identtrustca" value="123456"/>
</map>
</constructor-arg>
<constructor-arg type="java.lang.String" value="identtrustca"/>
</bean>
и консоли говорит:
Servlet.service() for servlet [jsp] in context with path [/spring-security-saml2-sample] threw exception
java.lang.UnsupportedOperationException: trusted certificate entries are not password-protected
Затем я прочитал this и this, поэтому я удалить элемент ввода (я считаю, что это секретный ключ материал), он становится:
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
<constructor-arg value="classpath:security/samlKeystore.jks"/>
<constructor-arg type="java.lang.String" value="123456"/>
<constructor-arg>
<map/>
</constructor-arg>
<constructor-arg type="java.lang.String" value="identtrustca"/>
</bean>
проблема теперь становится:
Servlet.service() for servlet [jsp] in context with path [/spring-security-saml2-sample] threw exception
java.lang.RuntimeException: Key with alias identtrustca doesn't have a private key
ДЕНЬ 2 вторая часть: Теперь я понимаю, что вместо создания нового хранилища ключей я должен просто использовать старые samlKeystore.jks. И если вы используете keytool -list -V -keystore d:\temp\samlKeystore.jks
, можно увидеть, что он содержит 3 элемента (изначально он имеет 2).
Я не понимаю, почему SP получает открытый ключ из метаданных IdP, но все еще нужен ca.cer IdP? Я считаю, что ca.cer с сайта Идент является сертификат IDP, хотя она отличается от той, которую я както openssl s_client -connect idp.ssocircle.com:443 -showcerts
Кроме того, теперь вместо того, чтобы Error decoding incoming SAML message
, сейчас я с HTTP Status 401 - Authentication Failed: Response issue time is either too old or with date in the future
ДЕНЬ 3 Когда я запустил SP, посетив http://localhost:8080/spring-security-saml2-sample/ как с хромом, так и с firefox, когда я нажал глобальный выход в один проводник и обновил другой, он не отображает страницу выхода. Я думал, что для SSO глобальный выход из одного и того же SP должен игнорировать многосеансовый сеанс, например, когда я глобальный выход из системы в один «логин», и я должен автоматически выйти из другого, я должен увидеть страницу выхода из системы другой проводник тоже (если я обновляюсь).На самом деле, для нескольких SPs, один я выйти из системы в одном, я должен быть в состоянии видеть выход из системы во всех ЗЛ, что я когда-то вошли в систему.
ДЕНЬ п Изменяя URL SAML проекта, нужно изменить метаданные idp.ssocircle.com (управление метаданными). В противном случае на idp-сайте появится ошибка. Это написано в docs/reference/htmlsingle/index.html
См. Http://stackoverflow.com/questions/40991685/saml-error-pkix-path-construction-failed-for-untrusted-credential –
@ VladimírSchäfer Привет, я обновил вопрос, ДЕНЬ 2 части. Пожалуйста, посмотрите спасибо. – Tiina
@ VladimírSchäfer Пожалуйста, см. ДЕНЬ 2 2-й части, ДЕНЬ 2 был очищен. :) – Tiina