Прямой HTTP к HTTPS за прокси в Spring Boot - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть сервер, написанный на Spring Boot (2.0.5).Он находится за прокси-сервером, который предоставляет SSL.Прокси-сервер принимает HTTP (80) и HTTPS (443) и перенаправляет их на мой сервер, который принимает HTTP только через порт 2222. Прокси-сервер устанавливает следующие заголовки запроса:

  • x-forwarded-for
  • x-forwarded-proto
  • x-forwarded-port

Я протестировал следующий код в классе WebSecurityConfig, и он не работал.

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
     httpSecurity.requiresChannel().anyRequest().requiresSecure()
     .and().
     ...  
}

Я также написал следующий код для перенаправления HTTP на HTTPS.Но он также перенаправляет HTTPS-трафик.Но мне нужно только перенаправить HTTP.

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HttpsConfiguration {

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {

            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        return tomcat;
    }
}

Я ищу способ проверить заголовки запроса и, если это HTTP, я хочу перенаправить его на HTTPS.

1 Ответ

0 голосов
/ 14 декабря 2018

Конфигурация Spring Security, которую вы предоставили, должна работать.Я предполагаю, что проблема в том, что вы не настроили Spring Boot для корректной работы с прокси .Чтобы включить поддержку, вы должны указать:

server.use-forward-headers=true

ПРИМЕЧАНИЕ. Если ваше приложение работает в Cloud Foundry или Heroku, свойство server.use-forward-headers по умолчанию имеет значение true.Во всех других случаях по умолчанию используется значение false.

Я бы особенно внимательно обратил внимание на подробности вокруг Tomcat .Это то, что вызывает у большинства людей проблемы.Tomcat использует дополнительную настройку, чтобы определить, соответствует ли внутренний IP-адрес прокси регулярному выражению по умолчанию.Если IP-адрес вашего прокси не соответствует регулярному выражению, он молча игнорирует перенаправленные заголовки.

Если вы боретесь с этим аспектом, попробуйте указать следующее:

server.tomcat.internal-proxies=.*

ПРИМЕЧАНИЕ. Другие серверы приложений не заботятся о прокси-IP-адресе и может ли клиент подделать XЗатем перенаправленные заголовки также могут подделать IP-адрес, поэтому открытие его для каждого IP-адреса не должно влиять на ваше приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...