Firefox und Chrome erzwingen weiterhin die HTTPS on Rails-App mit nginx / Passenger

7

Ich habe hier ein wirklich seltsames Problem, bei dem jedes Mal, wenn ich versuche, meine Rails-App im Nicht-SSL-Modus zu durchsuchen, Chrome (v16) und Firefox (v7) meine Website dazu zwingen, in HTTPS bereitgestellt zu werden.

Meine Rails-Anwendung wird auf einem Ubuntu VPS unter Verwendung von Capistrano, Nginx, Passenger und einem Wildcard-SSL-Zertifikat bereitgestellt.

Ich habe diese Parameter für Port 80 in der Datei nginx.conf festgelegt:

            passenger_set_cgi_param HTTP_X_FORWARDED_PROTO http;
            passenger_set_cgi_param HTTPS off;

Die Langversion meiner nginx.conf finden Sie hier: https://gist.github.com/2eab42666c609b015bff

Die Datei ssl-redirect.include enthält:

rewrite ^/sign_up https://$host$request_uri? permanent ;
rewrite ^/login https://$host$request_uri? permanent ;
rewrite ^/settings/password https://$host$request_uri? permanent ;

Es soll sichergestellt werden, dass diese drei Seiten HTTPS verwenden, wenn sie von einer Nicht-SSL-Anforderung stammen.

Meine Datei Production.rb enthält folgende Zeile:

  # Enable HTTP and HTTPS in parallel
  config.middleware.insert_before Rack::Lock, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' }

Ich habe versucht, über Nginx-Umschreibungen auf HTTP umzuleiten, Ruby on Rails umzuleiten und auch die URL der Rails-Ansicht mithilfe des HTTP-Protokolls verwendet.

Meine application.rb-Datei enthält die folgenden Methoden, die in einem before_filter-Hook verwendet werden:

def force_http
 if Rails.env.production?
   if request.ssl?
     redirect_to :protocol => 'http', :status => :moved_permanently
   end
 end
end

Jedes Mal, wenn ich versuche, zu HTTP ohne SSL umzuleiten, versucht der Browser, es zurück zu HTTPS umzuleiten, was zu einer Endlosumleitungsschleife führt. Safari funktioniert jedoch einwandfrei. Selbst wenn ich das Bereitstellen von SSL in Nginx deaktiviert habe, versuchen die Browser immer noch, über HTTPS eine Verbindung zur Site herzustellen. Ich sollte auch erwähnen, dass die Rails-Umleitung für alle Browser einwandfrei funktioniert, wenn ich meine App auf Heroku weitergebe.

Der Grund, warum ich Nicht-SSL verwenden möchte, ist, dass meine Homepage nicht sichere dynamische eingebettete Objekte und ein nicht sicheres CDN enthält und ich Sicherheitswarnungen verhindern möchte.

Ich weiß nicht, warum der Browser weiterhin HTTPS-Anforderungen erzwingt.

Steve
quelle
Können Sie den Inhalt von/opt/nginx/conf/ssl-redirect.include
Marcelo Bittencourt
Hallo, ich habe gerade mit dem Inhalt der Datei aktualisiert. Prost
Steve
Ich kann kein direktes Problem erkennen, aber versuchen Sie, das permanente Flag aus den Redirect-Direktiven zu entfernen, und ich bin nicht sicher, ob die 'Redirect-Root'-Direktive korrekt ist. Ist es ein Problem, die Domain offenzulegen?
Marcelo Bittencourt
Keine Sorge, Marcelo hat herausgefunden, dass HSTS das Problem verursacht hat.
Steve

Antworten:

9

Wenn Sie config.force_ssl = truein Ihrer Umgebungskonfiguration verwendet und diese später deaktiviert haben, stellt Ihr Browser möglicherweise immer noch nur Verbindungen über SSL her.

Rails sendet einen HSTS-Header, wenn dies der force_sslFall ist. Dies führt dazu, dass einige Browser nur Verbindungen über HTTPS zur betreffenden Domäne zulassen, unabhängig davon, was in der Adressleiste eingegeben wird. Diese Einstellung wird vom Browser standardmäßig 1 Jahr lang zwischengespeichert.

In diesem Blogbeitrag finden Sie einige Tipps, wie Sie dies vermeiden können: http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/#comment-40447

brookr
quelle
Heiliger Strohsack. Das ist ein großes Problem. Ich weiß, dass es zwei Jahre alt ist, aber jede Chance, dass Sie über dieses Thema auf dem Laufenden bleiben. Problemumgehungen? Ich muss das Erzwingen von SSL für bestimmte Seiten in einer App deaktivieren, damit Nicht-SSL-Seiten in Iframes geladen werden können.
Ryan Angilly
5

Ich habe einen Weg gefunden, HSTS aus einer Antwort in einem Wordpress-Supportforum ausgerechnet auszuschalten: https://wordpress.org/support/topic/want-to-turn-off-http-strict-transport-security-hsts -header # post-6068192

Sie können einen Header zurücksenden, der das HSTS-Caching deaktiviert. Getestet in Chrome mit diesem Beispiel before_filter in einer Rails 4-App:

response.headers['Strict-Transport-Security'] = 'max-age=0; includeSubDomains'
Ryan Angilly
quelle
Verdammt… ich war tief in diesem speziellen Fall bestückt. Du hast viel mehr als nur meinen Tag gerettet; Big Thx
Ben
Wirklich froh, dass es geholfen hat. Ich war so frustriert, als ich dieses letzte Jahr traf!
Ryan Angilly
Ich habe einige Benutzer, die sich darüber beschweren, dass sie bei Verwendung von Firefox für immer auf die Seite warten müssen (oder ich denke, ein Criptyc-Antivirus ist installiert). etwas von dieser Art auf Ihrer Seite?
Ben
Nein, ich denke nicht, aber dieses HSTS falsch zu verstehen ist super klebrig / nervig. Können Sie feststellen, ob die erste Anforderung für den Benutzer hängt oder ob das Rendern der Seite auf das Laden eines Assets wartet? Wenn Sie Assets von einer anderen Domain laden, haben Sie möglicherweise immer noch HSTS-Probleme in anderen Subdomains?
Ryan Angilly
Leider passiert es ohne wirklichen Grund, speziell unter Osx Capitan
Ben