Подтвердить что ты не робот

Как автоматически перенаправить https с помощью Spring Boot

Как я могу легко настроить встроенный сервер tomcat для перенаправления всего HTTP-трафика на https? У меня есть Spring Boot, работающий на экземпляре ec2, который находится за балансировкой эластичной нагрузки. Я настроил ELB для обработки ssl для меня (что здорово), и он устанавливает заголовок X-FORWARDED-PROTO в "https". Я хочу определить, когда это не задано, и перенаправить пользователя, чтобы заставить их использовать https, если они еще не были.

До сих пор я попытался добавить следующее в файл application.properties без везения:

server.tomcat.protocol-header=x-forwarded-proto
security.require-ssl=true
4b9b3361

Ответ 1

Мой ответ немного поздний, но у меня недавно была эта проблема, и я хочу опубликовать решение, которое сработало для меня.

Первоначально я думал, что установка tomcat для использования заголовков X-Forwarded будет достаточной, но RemoteIPValve от Tomcat, который обычно должен обрабатывать этот случай, не работал у меня.

Моим решением было добавить EmbeddedServletContainerCustomizer и добавить ConnectorCustomizer: (обратите внимание, что я использую Tomcat 8 здесь)

    @Component
public class TomcatContainerCustomizer implements EmbeddedServletContainerCustomizer {

    private static final Logger LOGGER = LoggerFactory.getLogger(TomcatContainerCustomizer.class);

    @Override
    public void customize(final ConfigurableEmbeddedServletContainer container) {
        if (container instanceof TomcatEmbeddedServletContainerFactory) {
                final TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
                tomcat.addConnectorCustomizers(connector -> { 
                    connector.setScheme("https");
                    connector.setProxyPort(443);
                });
                LOGGER.info("Enabled secure scheme (https).");
        } else {
            LOGGER.warn("Could not change protocol scheme because Tomcat is not used as servlet container.");
        }
    }
}

Важно то, что вы не только устанавливаете схему на https, но и ProxyPort, без которой все внутренние перенаправления из Spring Boot были перенаправлены на порт 80.

Надеюсь, что поможет: -)

Ответ 2

Вам понадобится файл хранилища ключей и несколько классов конфигурации.

В приведенной ниже ссылке подробно объясняется это.

Https на встроенном tomcat

Ответ 3

Свойство конфигурации security.require-ssl не работает, когда базовая проверка подлинности отключена (по крайней мере, в старых версиях Spring Boot). Таким образом, вам, вероятно, нужно будет вручную выполнить все запросы с помощью кода, подобного этому:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Inject private SecurityProperties securityProperties;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        if (securityProperties.isRequireSsl()) http.requiresChannel().anyRequest().requiresSecure();
    }
}

Вы можете проверить мой полный ответ здесь: Spring Загрузка перенаправления HTTP на HTTPS