HTTPS funktioniert nicht mit Safari

15

Ich habe eine EC2-Instanz mit Apache als Webserver (und Wildfly als App-Server, obwohl ich nicht sicher bin, ob es irgendetwas mit diesem Problem zu tun hat). Vor EC2 habe ich einen Load Balancer, der HTTPS beendet und das SSL-Zertifikat anwendet.

Sowohl HTTP als auch HTTPS funktionieren gut in Chrome, aber leider nicht in Safari. Der Zugriff auf http://test.papereed.com funktioniert einwandfrei, der Zugriff auf https://test.papereed.com führt jedoch zu einem Fehler

"Safari can't open the page. The error is "The operation couldn't be completed. Protocol error" (NSPOSIXErrorDomain:100)"

Ich habe in / etc / httpd / logs / error_log und / etc / httpd / logs / access_log und auch in der Safari-Konsole nachgesehen, ohne einen Hinweis zur Lösung des Problems zu finden. Und das ist ungefähr, wie weit mein Wissen geht :-( Irgendwelche Hinweise, wie man dieses Problem aufspürt, wären sehr dankbar.

jola
quelle

Antworten:

21

curl (wenn mit HTTP / 2-Unterstützung kompiliert) weist das gleiche Problem auf, zeigt jedoch den Grund:

http2-Fehler: Ungültiges HTTP-Headerfeld empfangen: Rahmentyp: 1, Stream: 1, Name: [Upgrade], Wert: [h2, h2c]

Es sieht so aus, als würde Ihr Server ein Upgrade auf HTTP / 2 anbieten, obwohl die Verbindung bereits mit HTTP / 2 hergestellt wurde - was keinen Sinn macht. Nicht nur das, es ist ausdrücklich verboten. In RFC 7540, Abschnitt 8.1.2.2 :

Ein Endpunkt DARF KEINE HTTP / 2-Nachricht generieren, die verbindungsspezifische Headerfelder enthält. jede Nachricht verbindungsspezifische Headerfelder enthalten muss als fehlerhaft behandelt wird (Abschnitt 8.1.2.6) .... connection- spezifische Header - Felder, wie Keep-Alive - Proxy-Verbindung, Transfer-Encoding und Aktualisieren

Es sieht für mich nach einem Bug aus, da Apache diesen Header nicht mit HTTP / 2 senden sollte.

Ich vermute, dass Sie eine solche Konfiguration haben

Protocols h2 h2c http/1.1

Da Browser HTTP / 2 ohnehin nicht ohne TLS unterstützen und bei HTTP / 2 über TLS kein Upgrade-Header erforderlich ist, empfehle ich, diese Konfiguration durch zu ersetzen

Protocols h2 http/1.1

Dadurch wird die Unterstützung für nicht benötigtes HTTP / 2 ohne TLS deaktiviert, der Upgrade-Header sollte jedoch hoffentlich auf diese Weise entfernt werden, da dies nur für das Upgrade von einfachem HTTP auf einfachem HTTP / 2 erforderlich ist.

EDIT: laut Kommentar des OP hat das Ändern der ProtocolsKonfiguration nicht geholfen. Es war notwendig, dieses Verhalten (dh den Fehler) mod_http2durch Löschen des UpgradeHeaders explizit zu umgehen:

Header unset Upgrade
Steffen Ullrich
quelle
2
Vielen Dank! Ich hatte in der Tat die folgende Konfiguration: # Enable HTTP/2 by default # https://httpd.apache.org/docs/2.4/mod/core.html#protocols <IfModule mod_http2.c> Protocols h2 h2c http/1.1 </IfModule> Nach Ihrer Empfehlung und dem Wechsel zu wurde Protocols h2 http/1.1der Upgrade-Header nicht entfernt. Stattdessen behielt ich die Protokollzeile bei und fügte Folgendes hinzu: Header unset UpgradeEntfernen des Headers. Ich kann nicht sagen, dass ich zu 100% weiß, was / warum hier passiert, aber jetzt funktioniert es auch in Safari :-)
Jola
@jola: danke für das feedback. Ich habe es in die Antwort aufgenommen.
Steffen Ullrich
3

Ich denke, dies ist eher ein Safari-Problem als ein AWS / SSL-Problem. Die Suche nach diesem Fehler führt bei Google zu sehr vielen Ergebnissen.

Auf der Website wird alles nach dem SSL-Shopper-Test und dem SSL-Labs-Test überprüft .

Ich habe diese mögliche Lösung für das Problem gefunden.

Die Lösung bestand darin, in den Safari-Einstellungen unter Datenschutz alle Details aufzulisten. Dies lieferte ein Protokoll aller Websites, auf denen Cookies usw. verwendet wurden. Ich habe die Domain-Seite "Weather Network" gefunden und den gesamten Inhalt daraus entfernt. Ich konnte dann die Weather Network-Seite ohne Probleme neu laden. Ich gehe davon aus, dass dies für andere ähnliche singuläre Sites funktionieren würde.

Es gibt auch diese , die mit Apache getan werden könnte.

Tim
quelle
Ja, ich habe dies gegoogelt, aber nichts gefunden, was direkt zutrifft (afaiu). Ich habe die vorgeschlagene Lösung für Nginx gelesen, bin mir aber nicht sicher, wie / ob dies für Apache gilt.
Jola
Apache wird ohne Zweifel in der Lage sein, den "Upgrade" -Header zu löschen , was alles ist, was Nginx tut.
Tim