HSTS preload header konform senden unmöglich?

  • Hi - benutze netcup schon lange privat für vServer, aber jetzt das erste mal das Webhosting für die Firma.

    Nachdem ich bereits die Umleitung von http:// auf https:// aktiviert habe möchte ich unsere Seite gerne noch HSTS Preloaden.

    Dazu muss auf der Haupt-Domain der Header Strict-Transport-Security: max-age=63072000; includeSubDomains; preload gesendet werden.

    Ferner darf man laut Standard den Header nur auf https:// senden, nicht auf http:// und auf einer Subdomain wie "www." ist preload wirkungslos.

    Im SSL Zertifikat/Let's Encrypt Menü gibt es keine Möglichkeit das preload Flag zu setzen.

    Gut, geschenkt, also dort HSTS deaktiviert und manuell unter Apache & nginx-Einstellungen > Zusätzliche Header eingetragen.

    Nach best-pratices sollte eine Website aber nicht direkt auf der Haupt-Domain ausgeliefert werden (wg. Cookies, CNAME, etc.),

    daher ist im CCP unter Bevorzugte Domain die www-Subdomain ausgewählt.

    Jetzt macht der netcup Webserver leider folgendes: Beim Aufruf von http://example.org leitet es direkt auf https://www.example.org weiter.

    D.h. der Browser kriegt den HSTS Header der sich auf ganz example.org auswirken würde nie zu sehen! Somit erlaubt auch hstspreload.org keine Eintragung.

    Das korrekte Verhalten nach Standard ist eine doppelte Umleitung http://example.org -> https://example.org -> https://www.example.org.

    Auf meinen Servern wo ich alles selber konfigurieren kann habe ich für die Haupt-Domain immer einen separaten vhost der nichts tut außer HSTS mit preload zu senden und auf www umleitet.

    Ich verzweifle leider daran dieses Verhalten im netcup Webhosting zu replizieren; das WCP erlaubt es mir nämlich nicht, die Subdomain "www" anzulegen, weil es heißt dass die Domain ohne das Präfix "www" schon existiert. Scheinbar ist die www-Subdomain implizit und untrennbar mit der Haupt-Domain verworren und man kann keine getrennten Einstellungen vornehmen.

  • Okay, mit etwas Pfusch kann man einen Workaround basteln.

    • Wie gesagt im WCP -> (Haupt-Domain) -> Apache & nginx Einstellungen -> Zusätzliche Header erstmal folgendes eintragen:

    Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

    • Bei den SSL/TLS Einstellungen den Redirect auf https:// aktivieren.
    • Unter CCP -> Produkte -> Webhosting -> (ggf. Domain auswählen) -> Bevorzugte Domain: "Keine" setzen - Dadurch wird der redirect auf www durch nginx deaktiviert.
    • Und im Stammverzeichnis eine .htaccess mit
    Apache Configuration
    <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </IfModule>

    Dann gibt es den erforderlichen doppelten Redirect so dass der Client den HSTS Header auf der Haupt-Domain sieht und hstspreload.org ist zufrieden.

    Optimal ist diese Lösung aber keinesfalls. Anfragen an www.example.org kriegen unterwünschterweise ebenfalls das "preload" im HSTS Header, was nutzlos aber zumindest unschädlich ist.

    Die Requests müssen unnötigerweise durch Apache obwohl nginx das machen könnte.

    Und Pfusch ist es deshalb weil die Rewrite rule ja nur greift wenn der Request bei Apache landet; eine Anfrage an "https://example.org/statische-datei.css" wird also nicht wie erwartet auf "https://www.example.org/statische-datei.css" weitergeleitet. Daher funktioniert das ganze auch nur wenn man eine index.php im Stammverzeichnis hat, eine index.html würde der nginx schon ausliefern und der Besucher bekommt den redirect nicht.

    Daher wäre es wünschenswert wenn das WCP bzw. der netcup Server das preload-Flag unterstützen bzw. das korrekte Verhalten umsetzen könnten.