Конечная точка получателя не совпадает с ответом SAML

Обычно моя реализация Spring SAML Service Provider (SP) работает нормально, но иногда она возвращает эту ошибку:

[2014-07-17 16:00:58.767] boot - 1078 DEBUG [http-bio-80-exec-1] --- BaseMessageDecoder:     Successfully decoded message.
[2014-07-17 16:00:58.767] boot - 1078 DEBUG [http-bio-80-exec-1] --- BaseSAMLMessageDecoder: Checking SAML message intended destination endpoint against receiver endpoint
[2014-07-17 16:00:58.768] boot - 1078 DEBUG [http-bio-80-exec-1] --- BaseSAMLMessageDecoder: Intended message destination endpoint: https://prismasp.cloud.reply.eu:443/MIUR_PRISMA-2.1-WEBUI/saml/SSO/alias/defaultAlias
[2014-07-17 16:00:58.768] boot - 1078 DEBUG [http-bio-80-exec-1] --- BaseSAMLMessageDecoder: Actual message receiver endpoint: http://prismasp.cloud.reply.eu:443/MIUR_PRISMA-2.1-WEBUI/saml/SSO/alias/defaultAlias
[2014-07-17 16:00:58.768] boot - 1078 ERROR [http-bio-80-exec-1] --- BaseSAMLMessageDecoder: SAML message intended destination endpoint 'https://prismasp.cloud.reply.eu:443/MIUR_PRISMA-2.1-WEBUI/saml/SSO/alias/defaultAlias' did not match the recipient endpoint 'http://prismasp.cloud.reply.eu:443/MIUR_PRISMA-2.1-WEBUI/saml/SSO/alias/defaultAlias'
[2014-07-17 16:00:58.782] boot - 1078 DEBUG [http-bio-80-exec-1] --- SAMLProcessingFilter: Incoming SAML message is invalid
org.opensaml.xml.security.SecurityException: SAML message intended destination endpoint did not match recipient endpoint
...

Я использую (в качестве параметра по умолчанию Spring Безопасность) HTTP Strict Transport Security (HSTS) на Tomcat 7 с SSL.

Есть ли способ исправить эту ошибку?


Примечание: исходный код образца находится на Github: vdenotaris/spring-boot-security-saml-sample.

Ответ 1

Я не знаю, почему ваша проблема возникает случайно, но, по крайней мере, один из способов ее устранения - это настроить SAMLContextProviderLB вместо вашего текущего SAMLContextProviderImpl.

SAMLContextProviderLB обычно используется, чтобы сообщать Spring SAML public об общедоступных URL-адресах, используемых на обратном прокси-сервере или балансировщике нагрузки, но в этом случае вы можете использовать, чтобы Spring SAML думал, что он использует HTTPS. Подробности можно найти в главе 10.1 "Расширенная настройка" руководства Spring SAML.

Вы также должны убедиться в правильности установки свойства entityBaseURL для вашего bean-компонента MetadataGenerator, поскольку без этого сгенерированные метаданные будут зависеть от того, сделали ли вы первый запрос к вашему приложению, используя http или https. Опять же, все это задокументировано.

Ответ 2

Я думаю, что ваш сервер приложений находится за балансировщиком нагрузки!

Для сервера Apache Tomcat, который работает за балансировщиком нагрузки приложения AWS, необходимо включить RemoteIPValue, чтобы на основе заголовка x-forwarded-proto Tomcat перезаписывал схему(https) & порт(443) соответственно.

В server.xml

<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto" internalProxies="10\.\d+\.\d+\.\d+|192\.168\.\d+\.\d+|169\.254\.\d+\.\d+|127\.\d+\.\d+\.\d+|172\.(1[6-9]|2[0-9]|3[0-1])\.\d+\.\d+" />