2017-06-27 4 views
0

Ich habe eine REST-App in Java geschrieben, die Jetty Embedded verwendet und auf einer Heroku-Umgebung ausgeführt wird. Ich möchte den gesamten Verkehr zwingen, durch HTTPS zu gehen. Es gibt einige gute Antworten darauf, wie dies zu erreichen ist, wie this one und this one. Alle Antworten erfordern jedoch das Lesen des TLS/SSL-Zertifikats aus einer Datei. Ich möchte Herokus Automated Certificate Management (Details here) verwenden, um zu vermeiden, dass Zertifikate jedes Jahr erneuert werden müssen, wenn sie ablaufen. Die Verwendung von ACM bedeutet, dass ich keinen Zugriff auf die Zertifikatsdatei habe.Erzwingen von HTTPS mit Jetty Embedded auf Heroku mit automatisierter Zertifikatsverwaltung

Gibt es eine Möglichkeit, Jetty zu konfigurieren, um HTTPS zu erzwingen, ohne das Zertifikat aus einer Datei zu lesen oder irgendwie Heroku ACM zu verwenden?

Antwort

1

werden Sie können mit einem Servlet-Filter tun dies die doFilter wie folgt implementieren:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest)request; 
    HttpServletResponse resp = (HttpServletResponse)response; 

    String protocol = req.getHeader("X-Forwarded-Proto"); 

    if (protocol.equals("http")) { 
     String url = "https://" + req.getServerName() + req.getContextPath() + req.getServletPath(); 
     if (req.getPathInfo() != null) { 
      url += req.getPathInfo(); 
     } 

     System.out.println("Forwarding request to: " + url); 
     resp.sendRedirect(url); 
    } else { 
     System.out.println("Not forwarding protocol: " + protocol); 
     chain.doFilter(request, response); 
    } 
} 

Hier a complete example using Tomcat, aber das Prinzip ist das gleiche.

+0

Danke @codefinger. Bei der Verwendung von Chrome ist X-Forwarded-Proto nicht als Kopfzeile enthalten, daher funktioniert das bei mir nicht. Ich sehe jedoch, dass HttpServletRequest.getScheme() scheint korrekt zu identifizieren, ob ich HTTP oder HTTPS verwende, also werde ich diesen Ansatz versuchen und die Ergebnisse veröffentlichen. –

+0

Okay, nach der Untersuchung stellt sich heraus, dass: HttpServletRequest.getScheme() ist nicht zuverlässig (es gibt "http" auch bei Verwendung von HTTPS auf Heroku), und HttpServletRequest.isSecure() ist auch nicht zuverlässig (gibt false bei der Verwendung von HTTPS auf Heroku). Der X-Forwarded-Proto-Header wird nicht an lokal ausgeführte Server gesendet, sondern an Server, die auf Heroku ausgeführt werden. Diese Antwort ist richtig. –

+0

Ich glaube, das Problem mit getScheme liegt darin, dass die SSL-Terminierung am Heroku-Router stattfindet (daher ist die Verbindung HTTP am Servlet). Am besten beide zu überprüfen? – codefinger

Verwandte Themen