0

Ich versuche, HTTPS in meiner Anwendung zu implementieren. Es ist eine JHipster/SpringBoot-App, die auf Port 8080 läuft. Ich habe HTTPS über AWS implementiert, um die Dinge einfacher zu machen, weil das Zertifikat automatisch vom AWS-Zertifikat-Manager-Dienst bearbeitet/erneuert werden kann.AWS EC2 Umleiten von HTTP zu HTTPS durch Load Balancer

Also habe ich nichts auf meinem Server geändert. Ich habe ein Zertifikat für AWS erstellt und eine LoadBalancer-Regel konfiguriert, um mithilfe des generierten Zertifikats von 443 auf 8080 umzuleiten. Wenn ich versuche, mit explizit HTTPS auf meine Domain zuzugreifen, funktioniert das wie ein Zauber.

Das Problem ist, dass ich auch HTTP-Zugriff auf HTTPS umleiten möchte, dann habe ich versucht, eine Regel um 80 bis 443 umzuleiten, so würde es in der ersten Regel (443 bis 8080) fallen und das Zertifikat verwenden, aber es funktioniert nicht. Bei der Online-Recherche habe ich festgestellt, dass ich meiner .htacess-Datei einige Zeilen hinzufügen sollte, funktioniert aber auch nicht. Ich denke, das ist nicht die Lösung in meinem Fall, da alle HTTPS-Sachen auf der AWS-Seite sind, gibt es eine Möglichkeit, HTTP nur über AWS zu HTTPS umzuleiten, ohne meinen Server zu wechseln?

Antwort

1

Sie müssten den HTTP-Verkehr als HTTPS-Umleitung behandeln, der ebenfalls Teil Ihrer Anwendung ist, und die erforderlichen Regeln und Konfigurationen berücksichtigen.

Zum Beispiel würden Sie mit dem Öffnen der ELB für Port 80 (HTTP) starten, die von den Web-Servern gehandhabt werden würden in 80 oder einem Port lauschen die Umleitung [separate Hörer]

auszuführen Wenn Sie mit Apache Web-Server, müssten Sie Regeln wie

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

Referenz:

  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

Die Antwort oben nicht für mich gearbeitet hat, weil ich nicht solche Datei verwendet haben. Am Ende mache ich einen BackEnd-Filter wie diesen:

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); 
    } 
} 
Verwandte Themen