Jelastic Grails перенаправляет http на https

У меня есть один домен app.mydomain.com, который сопоставлен с записью A с общедоступным IP-адресом (от сервера tomcat, принадлежащего mysub.jelastic.dogado.eu). Я настроил пользовательские сертификаты SSL, и все запросы HTTPS работают очень хорошо.

Все, что мне нужно, это чтобы мое приложение использовало только HTTPS, все HTTP-запросы перенаправлялись на HTTPS. В соответствии с плагином безопасности spring (1.2.7.4, который у меня есть в моем приложении), я настроил его следующим образом:

grails.plugins.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
    grails.plugins.springsecurity.portMapper.httpPort = 8080
    grails.plugins.springsecurity.portMapper.httpsPort = 8443
    grails.plugins.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto'
    grails.plugins.springsecurity.secureChannel.secureHeaderValue = 'http'
    grails.plugins.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto'
    grails.plugins.springsecurity.secureChannel.insecureHeaderValue = 'https'
    grails.plugins.springsecurity.auth.forceHttps = true
    grails.plugins.springsecurity.secureChannel.definition = [
            '/**':               'REQUIRES_SECURE_CHANNEL'
    ]

На локальном хосте все работает очень хорошо, все http-запросы перенаправляются на https, но в jelastic ничего не происходит. Я пробовал много конфигураций, заменяя порт https на 8743/443, но результаты те же. Любая помощь будет оценена.

Большое спасибо, Каталин


person Catalin Toader    schedule 12.02.2014    source источник
comment
но в jelastic ничего не произошло. - что ты конкретно имеешь ввиду? Цикл перенаправления, тайм-аут или полное отсутствие перенаправления? Также, согласно моему ответу, предоставьте топологию вашей среды.   -  person Damien - Layershift    schedule 13.02.2014


Ответы (2)


Заголовок X-Forwarded-Proto устанавливается только в том случае, если в вашей среде есть балансировщик нагрузки (или вы используете общий преобразователь, но, поскольку вы используете собственный сертификат SSL, который не может применяться в этом случае).

Если у вас в среде нет балансировщика нагрузки, то и проверка не работает — так как эти заголовки просто не установлены.

Если у вас есть балансировщик нагрузки, все запросы к вашему Tomcat направляются на порт 80 (перенаправляются через перенаправление портов на 8080); который включает запросы, отправленные на https (поскольку в этом случае балансировщик нагрузки выполняет «разгрузку SSL». Поэтому вы ищете невозможную комбинацию в своих правилах Grails (8743 и X-Forwarded-Proto). В зависимости от топологии вашей среды у вас будет один тех или иных случаев, но не обоих.

РЕДАКТИРОВАТЬ: Вы также должны дважды проверить свой server.xml, чтобы убедиться, что у вас есть это:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="443" />

Обратите внимание на значение redirectPort; это должно быть 443, потому что это порт, который будет отправлен в браузер для перенаправления - с балансировщиком нагрузки (или Jelastic Shared Resolver), проксирующим запросы, браузер должен запрашивать порт 443 (даже если коннектор Tomcat SSL настроен на 8743 - если применимо), потому что прокси использует стандартную нумерацию портов (т.е. https:// без какого-либо номера порта = 443).

Даже если вы работаете с автономным Tomcat (без балансировщика нагрузки и не через Jelastic Shared Resolver), эти запросы на 443 будут автоматически перенаправлены на 8743 для вас.

person Damien - Layershift    schedule 12.02.2014

Спасибо, Дэмиен, ваш ответ решил проблему. Для всех, кто заинтересован, это конфигурация (Config.groovy):

 production {
    grails.app.context = "/"        
    grails.serverURL = "https://yourdomain.com"
    grails.plugins.springsecurity.portMapper.httpPort = 80
    grails.plugins.springsecurity.portMapper.httpsPort = 443
    grails.plugins.springsecurity.auth.forceHttps = true
    grails.plugins.springsecurity.secureChannel.definition = [
            '/**': 'REQUIRES_SECURE_CHANNEL'
    ]
  }

Поместите это в server.xml:

<Connector port="80" protocol="HTTP/1.1"
       connectionTimeout="20000"
       redirectPort="443" />

Я полагаю, 8080 также работает.

Ведите войну, развертывайте.

person Catalin Toader    schedule 13.02.2014
comment
Обычно вы не можете запускать Tomcat напрямую через порт 80 (в Linux), если вы не сделаете специальные условия - см. stackoverflow.com/questions/10450045/, чтобы узнать, почему. Вот почему Jelastic использует 8080 и перенаправляет трафик с порта 80 на 8080 (поэтому фактический коннектор находится на 8080, но URL-адрес, введенный пользователем, не требует добавления порта (например: 8080). - person Damien - Layershift; 02.03.2014