Mixed Content: HTTP-Inhalte auf HTTPS-Seiten
Kurz: Eine per HTTPS geladene Seite bindet Ressourcen über unverschlüsseltes HTTP ein; Browser blockieren oder warnen davor.
Genauer: Meldung: Mixed Content: The page at 'https://…' was loaded over HTTPS, but requested an insecure resource 'http://…'. This request has been blocked. Auch wenn die Seite selbst verschlüsselt ist, könnte ein Angreifer unverschlüsselte Bilder, Skripte oder Stile mitlesen oder verändern.
Im Detail
Arten
- Aktiver Mixed Content (Skripte, Stylesheets, iframes, Fetch/XHR): wird von Browsern blockiert, da er die ganze Seite kompromittieren kann.
- Passiver Mixed Content (Bilder, Audio, Video): wurde früher nur mit Warnung geladen; moderne Browser laden ihn automatisch über HTTPS nach oder blockieren ihn.
- Das Schloss-Symbol verschwindet oder zeigt eine Warnung.
Ursachen
- Feste
http://-Adressen im HTML, CSS, JavaScript oder in der Datenbank (Inhalte aus früherer HTTP-Zeit). - Drittanbieter-Skripte oder eingebettete Medien mit HTTP.
- API-URLs, die in Konfiguration noch
http://enthalten. - Ein Proxy oder CDN, der die Seite als HTTP an den Browser weiterreicht oder falsche
X-Forwarded-Proto-Header setzt, sodass die Anwendung selbsthttp://-Links erzeugt.
Lösungswege
- In den Entwicklerwerkzeugen (F12 → Konsole) die betroffenen URLs ablesen.
- Auf HTTPS umstellen oder protokollrelative/relative Adressen nutzen (
/bild.png). - Gespeicherte Inhalte (CMS, Datenbank) ersetzen (
http://domain→https://domain). - Drittanbieter wechseln, wenn sie kein HTTPS unterstützen.
- Server so konfigurieren, dass Weiterleitung HTTP→HTTPS und HSTS aktiv sind; Proxy-Header richtig setzen.
- Die Content-Security-Policy
upgrade-insecure-requestsweist den Browser an, HTTP-Ressourcen automatisch auf HTTPS zu heben (nur ein Notbehelf; besser die Quelle korrigieren).
Siehe auch: HTTPS, Security-Header, Let’s Encrypt, ERR_CERT_DATE_INVALID