2016-12-20 8 views
2

Я сделал все, как описано в 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 в консоли.

пакет экран потока выстрел: package flow screenshot

ДЕНЬ 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

+0

См. Http://stackoverflow.com/questions/40991685/saml-error-pkix-path-construction-failed-for-untrusted-credential –

+0

@ VladimírSchäfer Привет, я обновил вопрос, ДЕНЬ 2 части. Пожалуйста, посмотрите спасибо. – Tiina

+0

@ VladimírSchäfer Пожалуйста, см. ДЕНЬ 2 2-й части, ДЕНЬ 2 был очищен. :) – Tiina

ответ

2

Сертификаты в метаданных IDP используются для цифровой подписи документов XML SAML. Свидетельство о вашей неудаче связано с конечной точкой HTTPS www.ssocircle.com, которую вызывает ваш SAML Spring во время разрешения Artifact. Эти два сертификата обычно различны.

SSOCircle недавно изменил центр сертификации, который выдает свой сертификат на www.ssocircle.com, а операция, описанная в SAML ERROR: PKIX path construction failed for untrusted credential, заключается в том, чтобы получить доверенность CA.

Ваша последняя ошибка, скорее всего, вызвана неправильной синхронизацией вашей пружинной машины SAML.

+0

Рассмотрение ответного сообщения, я замечаю, что ssocircle - это 3 минуты в будущем. Так что решите это по http://stackoverflow.com/questions/25647925/spring-security-saml-time-difference-between-sp-and-idp – Tiina

+0

Пожалуйста, посмотрите на проблему 3-го дня. Благодарю. – Tiina

+0

По умолчанию Spring SAML хранит информацию о сеансе пользователя в сеансе HTTP (= cookie), а Global Logout на стороне SP только делает недействительным тот сеанс, к которому имеет доступ браузер. LogoutProcessing Spring SAML поддерживает добавление пользовательских LogoutHandlers, поэтому, если у приложения есть хранилище с сеансами приложения для пользователя, вы можете аннулировать их все. –