it-swarm.com.de

Wenn Port 443 über http bereitgestellt wird, wird ein Fehler mit 400 fehlerhaften Anforderungen anstelle einer Umleitung erstellt

Aus Gründen der Nachwelt versuche ich, meinen Server so zu konfigurieren, dass jemand, der versucht, zu http: // domain.com:443 zu wechseln, korrekt zur https-Version der Site (https: //) weitergeleitet wird domain.com).

Wenn ich etwas wie http: // domain.com:443 teste, wird es nicht korrekt zu https: // domain.com umgeleitet. Stattdessen wird eine 400 Bad Request-Seite mit folgendem Inhalt angezeigt:

Ungültige Anforderung

Ihr Browser hat eine Anfrage gesendet, die dieser Server nicht verstehen konnte. Grund: Sie sprechen einfaches HTTP mit einem SSL-fähigen Server-Port. Verwenden Sie stattdessen das HTTPS-Schema, um auf diese URL zuzugreifen.

Apache/2.4.18 (Ubuntu) Server unter sub.domain.com Port 443

Ich habe versucht, die folgenden Zeilen in mein 000-default.conf in dem <VirtualHost *:80>:

RewriteEngine On 
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]

Aber es hat nicht funktioniert.

Dieses Problem tritt bei allen Domänen, Unterdomänen und der Server-IP selbst auf.

Möglicherweise ist der Versuch, einen Testlauf von letsencrypt durchzuführen, wie folgt:

   Domain: domain.com
   Type:   connection
   Detail: Failed to connect to 123.123.123.123:443 for TLS-SNI-01
   challenge

Für jede Domain, die im Sites-fähigen Ordner aufgeführt ist.

6
Bitz

TL; TR: Sie können nicht sowohl HTTP als auch HTTPS auf demselben Port bereitstellen (443).

Während es theoretisch möglich wäre, basierend auf den ersten Daten vom Client herauszufinden, ob der Client eine HTTP-Anfrage sendet (d. H. GET .. oder ähnlich) oder startet einen TLS-Handshake (\x16\x03...) Die meisten Webserver tun dies nicht. Stattdessen erwarten sie, dass sich der Client ordnungsgemäß verhält, dh einfaches HTTP an einem Port (normalerweise 80) und HTTPS an einem anderen Port (normalerweise 443).

Ihre URL von http://example.com:443 veranlasst den Browser, eine einfache HTTP-Anforderung an Port 443 zu senden. Der Server erwartet dort jedoch TLS, was bedeutet, dass Ihre einfache HTTP-Anforderung unerwartet ist. Apache ist mindestens nett genug, um zu überprüfen, ob die eingehenden Daten für eine einfache HTTP-Anforderung in diesem Fall vorliegen, damit Sie eine nützlichere Beschreibung erhalten:

Grund: Sie sprechen einfaches HTTP mit einem SSL-fähigen Server-Port. Verwenden Sie stattdessen das HTTPS-Schema, um auf diese URL zuzugreifen.

Wenn Sie solche Anforderungen mit anderen Servern versuchen, schließen diese entweder die Verbindung ohne Fehler oder hängen einfach, weil sie immer noch auf einen TLS-Handshake vom Client hoffen.

10
Steffen Ullrich

Ich hatte den gleichen Fehler und der Schuldige war, dass meine Konfiguration versuchte, SSL auf meinem Nicht-SSL-Port zu aktivieren. Jede Website-Adresse, die mit http:// Beginnt, wird über Port 80 (<VirtualHost *:80>) Geleitet, und dieser Host möchte nichts über SSL wissen. Alle Sites, die mit https:// Beginnen, werden über Port 443 geleitet (<VirtualHost *:443>).

Das direktere Problem war, dass ich die folgenden SSL-Details unter meinem *:80 - Host hatte, wodurch Apache versuchte, SSL für eine Nicht-SSL-Verbindung zu aktivieren.

SSLEngine on
SSLCertificateFile /bla.crt
SSLCertificateKeyFile /bla.key
SSLCertificateChainFile /bla.crt

Nachdem ich diese Zeilen aus *:80 Entfernt habe (und sichergestellt habe, dass sie unter <VirtualHost *:443> Vorhanden sind), ist mein Server wieder hochgefahren.

Also, hier sind meine <VirtualHost> (Alle in /etc/Apache2/sites-available/http.conf, Kann aber je nach Setup unterschiedlich sein):

<VirtualHost *:80>

    -- snip --

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]

</VirtualHost>


<VirtualHost *:443>

    -- snip --

    SSLEngine on
    SSLCertificateFile /var/www/ssl/STAR_iconcierge_net_au.crt
    SSLCertificateKeyFile /var/www/ssl/STAR_iconcierge_net_au.key
    SSLCertificateChainFile /var/www/ssl/STAR_iconcierge_net_au.crt

</VirtualHost>

Beachten Sie, wie *:80 (Http) eine Umschreibung in *:443 (Https) vornimmt, die dann SSL mit der Anweisung SSLEngine on Erzwingt.

3
Abraham Brookes

Was Sie tatsächlich suchen, ist das Zurücksenden von HSTS-Headern vom Webserver an die Benutzer, die den Browser anweisen, immer mit TLS auf die Site zuzugreifen. Dort findet keine 301 - Weiterleitung statt, wie Sie den Entwicklungstools in jedem Browser entnehmen können.

Dies geschieht beispielsweise bei Google. Nachdem Sie Google zum ersten Mal besucht haben, wurde Ihnen ein HSTS-Header gesendet, und Ihr Browser hat den Header in einer Liste gespeichert. Wenn Sie anschließend versuchen, mit google.com Eine Verbindung zu http:// Herzustellen, ändert der Browser die Verbindungsmethode automatisch in https://, Ohne dass eine Kommunikation mit dem Remote-Webserver erfolgt.

Dies ist ein weiterer Sicherheitsmechanismus, um Angriffe auf die Sicherheitsschicht zu verhindern.

2
Tero Kilkanen

Nichts, was sich im Abschnitt <VirtualHost *:80> Befindet, wird verarbeitet, wenn Sie über den Port 443 auf die Site zugreifen.

Testen Sie die Aktivierung der SSL-Version der Standard-Site, die mit Apache2 geliefert wird, und versuchen Sie, diese Conf dort in <VirtualHost *:443>

0
canciobello