0

Я пытаюсь реализовать HTTPS в своем приложении. Это приложение JHipster/SpringBoot, работающее на порту 8080. Я реализовал HTTPS через AWS, чтобы упростить работу, так как сертификат можно было автоматически обновлять или обновлять службой диспетчера сертификатов AWS.AWS EC2 перенаправляет HTTP на HTTPS корытный балансировщик нагрузки

Так что я ничего не менял на своем сервере. Я сгенерировал сертификат AWS и настроил правило LoadBalancer для перенаправления с 443 до 8080 с использованием сгенерированного сертификата. Когда я пытаюсь получить доступ к моему домену, используя явно HTTPS, он работает как шарм.

Проблема в том, что я также хочу перенаправить HTTP-доступ к HTTPS, тогда я попытался добавить правило для перенаправления 80 на 443, поэтому он попадет в первое правило (от 443 до 8080) и будет использовать сертификат, но он не работает. Изучая онлайн, я обнаружил, что должен добавить некоторые строки в мой .htacess-файл, но не работает. Я думаю, что это не решение в моем случае, поскольку все материалы HTTPS находятся на стороне AWS, есть ли способ перенаправить HTTP на HTTPS только через AWS без изменения моего сервера?

ответ

1

Вам необходимо будет обрабатывать HTTP-трафик для перенаправления HTTPS как часть вашего приложения и учитывать необходимые правила и конфигурации.

Например, вы бы начать с открытия ELB для порта 80 (HTTP), который будет заниматься веб-серверов прослушивания в 80 или любой порт, чтобы выполнить переадресацию [отдельный слушатель]

Если вы используете веб-сервер Apache, вы бы необходимые правила, как

<VirtualHost *:80> 
... 
RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} 
... 
</VirtualHost> 

Ссылка:

  1. http://www.emind.co/how-to/how-to-force-https-behind-aws-elb/
  2. Rerouting all http traffic to https with AWS ELB
1

Ответ выше не работал для меня, потому что я не использовал такой файл. В конце концов я делаю фильтр BackEnd следующим образом:

import javax.servlet.*; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 

public class HttpToHttpsFilter implements Filter { 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void destroy() { 
     // Nothing to destroy 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     HttpServletResponse httpResponse = (HttpServletResponse) response; 

     String protocol = httpRequest.getHeader("X-Forwarded-Proto"); 
     if (protocol != null) { 
      if(protocol.toLowerCase().equals("https")) { 
       httpResponse.setHeader("Strict-Transport-Security", "max-age=60"); 
      } 
      else if(protocol.toLowerCase().equals("http")) { 
       String host = httpRequest.getServerName(); 
       String requestURI = httpRequest.getRequestURI(); 
       String redirectUrl = "https://" + host + requestURI; 
       httpResponse.sendRedirect(redirectUrl); 
       return; 
      } 
     } 

     chain.doFilter(request, response); 
    } 
} 
Смежные вопросы