Wie leitet man HTTPS zu HTTP um?

166

Wie leitet man HTTPS zu HTTP um? Das Gegenteil von dem, was (scheinbar) jeder lehrt.

Ich habe einen Server auf HTTPS, für den ich eine SSL-Zertifizierung bezahlt habe, und einen Spiegel, für den ich keine habe und der nur für Notfälle zur Verfügung steht, sodass es sich nicht lohnt, eine Zertifizierung zu erhalten.

Auf den Desktops meines Kunden befinden sich einige Verknüpfungen, die auf http://production_serverund verweisen https://production_server(beide funktionieren). Ich weiß jedoch, dass, wenn mein Produktionsserver ausfällt, die DNS-Weiterleitung aktiviert wird und die Clients, deren Verknüpfung "https" enthält, auf https://mirror_servereinen großen, fetten roten Bildschirm von Internet Explorer 7 starren (was nicht funktioniert) für meine Firma.

Leider kann ich dies nicht einfach auf Client-Ebene umschalten. Diese Benutzer sind sehr Computer-Analphabeten: und es ist sehr wahrscheinlich, dass sie HTTPS-Unsicherheitsfehler sehen (insbesondere die Art und Weise, wie Firefox 3 und Internet Explorer 7 heutzutage damit umgehen: FULL STOP, irgendwie dankbar, aber hier nicht hilfreich LOL).

Es ist sehr einfach , Apache-Lösungen für die http-> https-Umleitung zu finden , aber für mein Leben kann ich nicht das Gegenteil tun.

Ideen?

Mauriciopastrana
quelle
2
TU das nicht ! HTTPS-Weiterleitungen von HTTP sind äußerst gefährlich (und werden tatsächlich bald von allen Browsern aufgrund von Missbrauch blockiert), insbesondere wenn dies ein Knoten über den stillen HTTP-Status ist (dies gilt jedoch auch, wenn dies über Javascript erfolgt), es sei denn: (1) Es gibt eine vorübergehende HTTPS-Parkseite, auf der Benutzer aufgefordert werden, einen Link durch aktives Klicken zu öffnen. oder: - (2) das HTTPS leitet in genau der gleichen Domäne zu HTTP um UND die Weiterleitungen ändern den angeforderten Inhaltstyp nicht. Das Zulassen in Browsern hat es vielen Malwares ermöglicht, die Isolation zu bestehen. Solche Weiterleitungen täuschen sehr.
verdy_p
4
Dies sieht aus wie eine interne Site, auf der das OP weiß, was damit los ist, und daher nicht gefährlich ... Wenn dies ein Web-Server wäre, würde ich Ihnen zustimmen, aber ein interner, nur lokaler Webserver, eine Weiterleitung in Diese Mode wäre kein Problem.
Stese
@verdy_p Ich arbeite an HTTPS-zu-HTTP-302-Weiterleitungen, bei Captive-Portalen. Können Sie mich auf eine Dokumentation verweisen, auf die Sie sich beziehen?
Jprusakova
Führen Sie für Ihr Captive-Portal niemals eine HTTPS-zu-HTTP-302-Umleitung durch, es sei denn, dies ist genau dieselbe Domäne (nicht einmal eine Subdomain). Und da ein hohes Risiko der Offenlegung von Informationen besteht, achten Sie auf Sitzungstoken und Cookies, die bei der Weiterleitung transparent weitergegeben werden! Sie sollten wissen, dass HTTP-Ziele optimiert und Informationen von Malware-transparenten Proxys und sogar von böswilligem DNS übernommen werden können: Ihr Kunde weiß möglicherweise nicht einmal, dass Ihr Nur-HTTP-Ziel nicht erreichbar ist und tatsächlich zu einem Blackhat geht! Tun Sie dies also niemals bei HTTPS-Links, die private Sitzungen / Cookies / Anforderungen enthalten.
verdy_p
Solche HTTPS 302-Weiterleitungen sind immer eine Sicherheitslücke in Ihrer HTTPS-Site. Das große Risiko besteht darin, dass Sitzungen gestohlen werden und Ihre authentifizierten Benutzer ihre privaten Konten abrufen. Und in jedem Fall NIEMALS solche Weiterleitungen zum Laden von Javascripts oder aktiven Multimedia-Inhalten durchführen: Dies ist eine offene Tür im HTTPS-Bereich "Sandbox". Denken Sie wirklich daran, etwas in umgekehrter Reihenfolge zu tun: Leiten Sie HTTP zu HTTPS um (insbesondere zu Ihrem Hauptportal oder zu statischen öffentlichen Seiten, für die keine privaten Daten / Sitzungen / Cookies erforderlich sind) und verwenden Sie HTTPS für immer. Wenn Sie jemals von HTTPS zu HTTP
wechseln müssen

Antworten:

128

Dies wurde nicht getestet, aber ich denke, dies sollte mit mod_rewrite funktionieren

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
Ejunker
quelle
1
Wie mache ich das? (Was muss ich von diesem Code in meine Domain ändern, damit dieser Code funktioniert?)
Enve
1
Enve: Fügen Sie einfach die Konfiguration vhost_ssl.conf Ihrer Site hinzu (oder .htaccess im Stammverzeichnis der Site). Es muss nichts geändert werden, es wird dynamisch derselbe Hostname und URL-Pfad verwendet.
Darren Felton
1
Ich denke, Sie möchten vielleicht auch Abfragezeichenfolgen abfangen. Ich bin nicht sicher, aber ich denke, dass das obige Snippet keine Abfragezeichenfolgen von https an http weiterleitet.
Rustavore
12
Wie von Kieron weiter unten ausgeführt, würde dies nicht funktionieren, wenn der Spiegelserver kein gültiges Zertifikat hat. Aufgrund eines ungültigen Zertifikats wird weiterhin eine große rote Warnung angezeigt. Sobald Sie anfangen, https zu verwenden, bleiben Sie im Grunde dabei. Seien Sie bereit, für den Rest Ihres Lebens dafür zu bezahlen. Wenn Sie nicht mehr zahlen, können Personen, die die https-Links mit einem Lesezeichen versehen haben, nicht durchkommen.
Stephen Cheng
2
Den Rest deines Lebens bezahlen? Sie können weiterhin HTTPS verwenden, aber Ihren PKI-Anbieter wechseln und neue günstigere Zertifikate erhalten. Sie zahlen zwar immer noch ein paar Dollar, aber das Gleiche gilt für Ihren Domainnamen und Ihr Hosting! Ein PKI-Zertifikat ist jetzt im Vergleich zu Domain-Namen NICHT mehr teuer und im Vergleich zu Hosting- / Bandbreitenkosten unbedeutend!
verdy_p
71

Beachten Sie, dass die Rewrite-Engine erst nach Eingang der HTTP-Anforderung aktiviert wird. Dies bedeutet, dass Sie weiterhin ein Zertifikat benötigen, damit der Client die Verbindung zum Senden der Anforderung herstellen kann.

Wenn der Sicherungscomputer jedoch denselben Hostnamen zu haben scheint (was den Client betrifft), sollte es keinen Grund geben, warum Sie nicht dasselbe Zertifikat wie der Hauptproduktionscomputer verwenden können.

Kieron
quelle
1
Wie kann diese Einschränkung überwunden werden? Ich habe das gleiche Problem. Abrufen des Zertifizierungsfehlers vom Browser vor der Umleitung.
Sandeep Balagopal
Es wäre schön, eine Umleitung zurück zu HTTP zu haben, wenn es einen Zertifikatfehler gibt
Jeffrey die Giraffe
Das macht den Zweck, HTTPS überhaupt zu haben, völlig
zunichte
12

Basierend auf der Antwort von ejunker ist dies die Lösung, die für mich funktioniert, nicht auf einem einzelnen Server, sondern in einer Cloud- Umgebung

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Antonym
quelle
Die Verwendung von 301 kann wenig gefährlich sein. 301 bedeutet dauerhaft entfernt und ich denke, der Wechsel von https zu http ist vorübergehend. Sehen Sie diese akzeptierte Antwort für die Nachteile für Benutzer stackoverflow.com/questions/1393280/…
yusuf tezel
Die permanente / temporäre Unterscheidung 301/302 ist nur für Suchmaschinen relevant.
Matthewv789
9

Für diejenigen, die eine .confDatei verwenden.

<VirtualHost *:443>
    ServerName domain.com
    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/domain.crt
    SSLCertificateKeyFile /etc/apache2/ssl/domain.key
    SSLCACertificateFile /etc/apache2/ssl/domain.crt

</VirtualHost>
Rick
quelle
8

Wenn keine der oben genannten Lösungen für Sie funktioniert (für mich nicht), hat dies auf meinem Server funktioniert:

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]
rg88
quelle
6
Oft wollen Sie das nicht L,(was "Letzte Regel" bedeutet). Wenn Sie WordPress oder ein anderes CMS verwenden, verhindert das LFlag möglicherweise, dass die Seitenanforderung ordnungsgemäß weitergeleitet wird. Verwenden Sie stattdessen:RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301]
Rustavore
5

all das hat nicht funktioniert, als ich cloudflare verwendet habe, dieses hat für mich funktioniert:

RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

und dieser funktioniert definitiv ohne Proxies im Weg:

RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
mikulabc
quelle
3

Es ist besser, mod_rewrite zu vermeiden, wenn Sie können.

In Ihrem Fall würde ich das Umschreiben durch Folgendes ersetzen:

    <If "%{HTTPS} == 'on'" >
            Redirect permanent / http://production_server/
    </If>

Die <If>Direktive ist nur in Apache 2.4+ gemäß diesem Blog hier verfügbar .

sys0dm1n
quelle
In einer gehosteten Umgebung kann man die Version von Apache mit/usr/sbin/httpd -v
Serge Stroobandt
1

das funktioniert bei mir.

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
    Redirect "https://www.example.com/" "http://www.example.com/"
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # ... 
</VirtualHost>

Achten Sie darauf, beide Ports 80 und 443 abzuhören.

Jaxarroyo
quelle
0

Keine der Antworten funktioniert für mich auf der Wordpress-Website, aber die folgenden funktionieren (sie ähneln anderen Antworten, haben jedoch eine kleine Änderung).

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Yuseferi
quelle
Verwenden Sie solche Regeln nicht blind für alle REQUEST_URI (dies sollte nicht verwendet werden, wenn Formulardaten in der URI oder Cookies / Sitzungs-IDs in den Anforderungsmetadaten enthalten sind). Verwenden Sie es nur für statische öffentliche Seiten / Bilder. Vermeiden Sie dies vollständig für Javaskripte oder aktive Komponenten (insbesondere skriptfähige Videostreams oder aktive PDFs, sofern diese nicht von Ihnen digital signiert wurden! Es ist immer noch nicht möglich, Javaskripte digital zu signieren, sondern behalten Sie sie nur in Ihrer sicheren Domain).
verdy_p
Hinweis: Einige Bildformate sind aktiv und skriptfähig. Achten Sie beispielsweise auf SVG. Wir haben Angriffe auf einige HTTPS-Websites gesehen, die SVG-Bilder von HTTP laden (mit den 302 Weiterleitungen der Site) und von Malware geerntet wurden, die Skripte in SVG-Inhalte einfügt ... Idealerweise sollten Browser HTTP-Unterinhalte von HTTPS isolieren und in eine Sandbox legen (also CORS) Sicherheitsbeschränkungen sollten auch gelten, auch wenn sie denselben Domänennamen haben ...), sodass "http: // (Domäne) / ..." und "https: // (Domäne) /" als unterschiedliche Domänen für zu betrachten sind CORS (nicht derselbe Ursprung), auch wenn sie sich auf derselben TCP-Portnummer befinden.
verdy_p
@verdy_p, was genau meinst du damit "mit den 302 Weiterleitungen der Site"? Sie müssen zuerst die Server-Site besitzen (oder Teilnehmerknoten auf TCP / IP-Ebene, wie DNS-Server, Router), um diese HTTP-Ressourcenanforderung auszunutzen, oder?
Gr.
Nicht unbedingt. HTTPS in einer Domäne ist sicher, während HTTP in derselben Domäne nicht sicher ist (Exploits erfordern keine Steuerung einer IP oder von Routern oder DNS-Servern, selbst wenn DNSSEC verwendet wird; Exploits können nur IP-Spoofing verwenden, das ohne HTTPS nicht sicher erkannt werden kann sichere Sitzungen). Daher behaupte ich, dass eine HTTPS-Site Bilder (auch in derselben Domäne) hosten muss, indem sie nicht mit HTTP bedient werden (in einigen Browsern, die einen Aktivierungsklick erfordern oder diese unsicheren Bilder maskieren, wird dies sogar standardmäßig verweigert). Gemischtes HTTPS / HTTP muss gesperrt werden: Die Site kann über ihre HTTP-Teile (z. B. Track-Pixel) angegriffen werden.
verdy_p
-6

Soweit mir bekannt ist, funktioniert eine einfache Meta-Aktualisierung auch fehlerfrei:

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">
RobinUS2
quelle
12
Ich wünschte, die Wähler müssten Kommentare hinterlassen, in denen die Gründe für die Ablehnung der Stimmen erläutert werden. Persönlich würde ich diese Antwort nur wählen, wenn Sie als Entwickler keinen Zugriff auf den Server hatten, für den Sie entwickelt haben, aber Zugriff auf die Seite hatten. Ein Problem ist, dass Sie jeden Pfad auf jeder Seite fest codieren müssen, damit dies funktioniert. Wenn Sie davon ausgehen können, dass JavaScript für Ihre wichtigen Anwendungsfälle aktiviert ist, sollten Sie JavaScript verwenden, um zu http zu wechseln. Die obigen Antworten sind besser, da sie kein Javascript erfordern, da sie auf dem Server auftreten.
Rustavore
2
Einfach: weil htaccess eine weitaus bessere Option ist. Außerdem wird das Problem der Umleitung des https-Protokolls zu http nicht behoben, wenn Sie kein Zertifikat haben.
Mitte
1
Die Aktion sollte vom Server verarbeitet werden und nicht von einem Dokument, das möglicherweise bereitgestellt wird.
Albal