HTTPS nie działa z Safari

16

Mam instancję EC2 z Apache jako serwerem WWW (i Wildfly jako serwerem aplikacji, chociaż nie jestem pewien, czy ma to coś wspólnego z tym problemem). Przed EC2 mam moduł równoważenia obciążenia, który kończy HTTPS i stosuje certyfikat SSL.

Zarówno HTTP, jak i HTTPS działają dobrze w Chrome, ale niestety nie w Safari. Dostęp do http://test.papereed.com działa dobrze, ale dostęp do https://test.papereed.com daje błąd

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

Zajrzałem do / etc / httpd / logs / error_log i / etc / httpd / logs / access_log, a także w konsoli Safari, nie znajdując żadnej wskazówki na temat rozwiązania problemu. I o tym, jak daleko posunę się moja wiedza :-( Wszelkie wskazówki, jak prześledzić ten problem, byłyby mile widziane.

jola
źródło

Odpowiedzi:

22

curl (jeśli skompilowany z obsługą HTTP / 2) wykazuje ten sam problem, ale pokazuje przyczynę:

błąd http2: Otrzymano nieprawidłowe pole nagłówka HTTP: typ ramki: 1, strumień: 1, nazwa: [aktualizacja], wartość: [h2, h2c]

Wygląda na to, że twój serwer oferuje aktualizację do HTTP / 2, nawet jeśli połączenie zostało już wykonane przy użyciu HTTP / 2 - co nie ma sensu. Co więcej, jest to wyraźnie zabronione. Z RFC 7540 sekcja 8.1.2.2 :

Punkt końcowy NIE MOŻE wygenerować komunikatu HTTP / 2 zawierającego pola nagłówka specyficzne dla połączenia; każda wiadomość zawierająca pola nagłówka specyficzne dla połączenia MUSI być traktowane jako zniekształcone (Rozdział 8.1.2.6) .... pola nagłówka specyficzne dla połączenia, takie jak Keep-Alive, Proxy-Connection, Transfer-Encoding i Upgrade

Wygląda na błąd, ponieważ Apache nie powinien wysyłać tego nagłówka za pomocą HTTP / 2.

Domyślam się, że masz taką konfigurację

Protocols h2 h2c http/1.1

Biorąc pod uwagę, że przeglądarki i tak nie obsługują protokołu HTTP / 2 bez TLS i że nagłówek aktualizacji nie jest potrzebny w przypadku protokołu HTTP / 2 przez protokół TLS, zalecamy zastąpienie tej konfiguracji poleceniem

Protocols h2 http/1.1

To wyłącza obsługę niepotrzebnego HTTP / 2 bez TLS, ale mam nadzieję, że w ten sposób pozbędę się nagłówka Upgrade, ponieważ jest to potrzebne tylko do aktualizacji z zwykłego HTTP na zwykły HTTP / 2.

EDYCJA: zgodnie z komentarzem OP zmiana Protocolskonfiguracji nie pomogła. Konieczne było jawne obejście tego zachowania (tj. Błędu) mod_http2poprzez usunięcie Upgradenagłówka:

Header unset Upgrade
Steffen Ullrich
źródło
3
Dziękuję Ci! Rzeczywiście miałem następującą konfigurację: # 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> Postępowanie zgodnie z twoimi zaleceniami i przejście naProtocols h2 http/1.1 nie usunąłem nagłówka aktualizacji, więc zamiast tego zachowałem linię Protocols w obecnej postaci i dodałem następujące: Header unset Upgradeaby usunąć nagłówek. Nie mogę powiedzieć, że jestem w 100%
lepszy
@jola: dzięki za opinie. Włączyłem to do odpowiedzi.
Steffen Ullrich
3

Myślę, że jest to problem związany z Safari, a nie AWS / SSL. Poszukiwanie tego błędu przynosi wiele, wiele wyników w Google.

Wszystko sprawdza się na stronie internetowej zgodnie z testem SSL Shopper i testem SSL Labs .

Znalazłem to możliwe rozwiązanie problemu.

Rozwiązaniem było przejście do Preferencji Safari, w sekcji Prywatność i wyświetlenie wszystkich szczegółów. To zapewniło dziennik wszystkich witryn, w których zastosowano pliki cookie itp. Znalazłem stronę domeny Weather Network i usunąłem z niej całą zawartość. Byłem wtedy w stanie przeładować stronę Weather Network bez żadnych problemów. Zakładam, że działałoby to w przypadku innych podobnych pojedynczych stron.

Jest też to , które można zrobić z Apache.

Tim
źródło
Tak, przeszukałem to, ale nie znalazłem niczego, co dotyczy bezpośrednio (afaiu). Przeczytałem proponowane rozwiązanie dla nginx, ale nie jestem pewien, jak / jeśli dotyczy to apache.
jola
Apache bez wątpienia będzie w stanie usunąć nagłówek „Upgrade” , co właśnie robi Nginx.
Tim