Contao - Strict-Transport-Security HSTS

'Mathias Arzberger'
Mathias Arzberger

Hinzufügen von HSTS-Headern zu allen Antworten bei Verwendung von Contao und php-fpm + mod_fastcgi mit einfachem PHP, .htaccess oder Symfony.

Contao und der Strict-Transport-Security Header

Fehler:

HTTP Strict Transport Security (HSTS) Header kann nicht gesetzt werden, da die Website eine ungültige Zertifikatskette enthält
oder
HTTP Strict Transport Security (HSTS) Header nicht implementiert

Warum erhalte ich diese Fehlermeldung von Mozilla Observatory?

Wenn eine Website eine Verbindung über HTTP annimmt und auf HTTPS umleitet, können Besucher zunächst mit der unverschlüsselten Version der Website kommunizieren, bevor sie umgeleitet werden, wenn sie beispielsweise http://pdir.de oder auch nur pdir.de eingeben. Dies schafft die Möglichkeit für einen Man-in-the-Middle-Angriff. Die Umleitung könnte ausgenutzt werden, um Besucher auf eine bösartige Website statt auf die sichere Version der ursprünglichen Website zu leiten.

Der HTTP Strict Transport Security-Header teilt dem Browser mit, dass er eine Website niemals über HTTP laden und alle Versuche, über HTTP auf die Website zuzugreifen, automatisch in HTTPS-Anfragen umwandeln soll.

 

Fehlermeldung

Test: HTTP Strict Transport Security 	
Score: -20
Reason: HTTP Strict Transport Security (HSTS) header cannot be set, as site contains an invalid certificate chaind

Lösung: Hinzufügen von HSTS-Headern bei Verwendung von Contao und php-fpm + mod_fastcgi mit PHP oder Symfony

.htaccess

# add HTTP Strict Transport Security (HSTS) header to all *non-php* responses
# - mod_fastcgi apparently ignores mod_headers?
# - see: https://www.owasp.org/index.php/HTTP_Strict_Transport_Security

Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"

Setzen des Strict-Transport-Security header via META Tag

<meta http-equiv="Strict-Transport-Security" content="max-age=31536000; includeSubDomains">

Setzen des Strict-Transport-Security header via PHP

<?php
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');

Setzen des Content Security Policy header via nelmio/security-bundle bzw. config.yml

# Security configuration
nelmio_security:
    forced_ssl:
        hsts_max_age: 31536000 # 1 year
        hsts_subdomains: true

So könnte deine config.yml aussehen:

# Security configuration
nelmio_security:
  clickjacking:
    paths:
      '^/.*': ALLOW
  forced_ssl:
    hsts_max_age: 31536000 # 1 year
    hsts_subdomains: true
  csp:
    enabled: true
    hash:
      algorithm: sha256
    enforce:
      default-src:
        - 'none'
      img-src:
        - 'self'
        - 'data:'
        - 'blob:'
        - 'unsafe-inline'
      script-src:
        - 'self'
        - 'data:'
        - 'blob:'
        - 'unsafe-inline'
      font-src:
        - 'self'
        - 'data:'
      style-src:
        - 'self'
        - 'data:'
        - 'unsafe-inline'

Aktivierung von HSTS bei ALL-INKL.com

Voraussetzung für die Verwendung von HSTS ist ein aktives SSL Zertifikat. Dafür findest du hier eine entsprechende Anleitung um beim SSL-Zertifikat die Aktivierung von HSTS durchzuführen.

Die Konfiguration hängt natürlich stark von deinen Setup ab und welche Funktionen du einsetzt. Solltest du Hilfe benötigen, helfen wir dir gern weiter. Nutze für eine Anfrage unser Kontaktformular.

Was ist die Strict-Transport-Security?

Der HTTP Strict-Transport-Security-Antwort-Header (oft als HSTS abgekürzt) informiert die Browser darüber, dass der Zugriff auf die Website nur über HTTPS erfolgen sollte, und dass alle zukünftigen Zugriffsversuche über HTTP automatisch in automatisch in HTTPS umgewandelt werden.

Der Header besteht aus einem obligatorischen Parameter (max-age) und zwei optionalen Parametern (includeSubDomains und preload), die durch Semikolons getrennt sind.

max-age muss auf mindestens sechs Monate (15768000) gesetzt werden, aber längere Zeiträume wie ein (31536000) oder zwei Jahre (63072000) werden empfohlen. Sobald dieser Wert festgelegt ist, muss die Website weiterhin HTTPS unterstützen, bis die Verfallszeit erreicht ist.

includeSubDomains teilt dem Browser mit, dass alle Subdomains des aktuellen Ursprungs ebenfalls über HSTS aktualisiert werden sollen. Wenn Sie beispielsweise includeSubDomains auf domain.mozilla.com setzen, wird es auch auf host1.domain.mozilla.com und host2.domain.mozilla.com gesetzt. Äußerste Vorsicht ist geboten, wenn Sie das includeSubDomains-Flag setzen, da es Websites auf Subdomains deaktivieren könnte, die noch kein HTTPS aktiviert haben.

preload ermöglicht die Aufnahme der Website in die HSTS-Preload-Liste bei der Anmeldung. Dies hat zur Folge, dass Webbrowser HTTPS-Upgrades auf die Website durchführen, ohne jemals den anfänglichen HSTS-Header empfangen zu müssen. Dies verhindert Downgrade-Angriffe bei der ersten Nutzung und wird für alle Websites mit hohem Risiko empfohlen. Beachten Sie, dass für die Aufnahme in die HSTS-Preload-Liste auch includeSubDomains festgelegt werden muss.

Weitere Infos erhältst auf der Mozilla Website.

Zurück