HTTPS ne fonctionne pas avec Safari

16

J'ai une instance EC2 avec Apache comme serveur Web (et Wildfly comme serveur d'application, même si je ne suis pas sûr que cela ait quelque chose à voir avec ce problème). Devant EC2, j'ai un équilibreur de charge qui termine HTTPS et applique le certificat SSL.

HTTP et HTTPS fonctionnent bien dans Chrome, mais malheureusement pas dans Safari. Accéder à http://test.papereed.com fonctionne bien, mais accéder à https://test.papereed.com donne l'erreur

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

J'ai regardé dans / etc / httpd / logs / error_log et / etc / httpd / logs / access_log et aussi dans la console Safari sans trouver aucun indice pour résoudre le problème. Et c'est à peu près jusqu'où mes connaissances vont :-( Tout indice sur la façon de suivre ce problème serait très apprécié.

jola
la source

Réponses:

22

curl (si compilé avec le support HTTP / 2) présente le même problème mais montre la raison:

Erreur http2: un champ d'en-tête HTTP non valide a été reçu: type de trame: 1, flux: 1, nom: [mise à niveau], valeur: [h2, h2c]

Il semble que votre serveur propose une mise à niveau vers HTTP / 2 même si la connexion est déjà établie avec HTTP / 2 - ce qui n'a aucun sens. Non seulement cela, il est explicitement interdit. De la RFC 7540 section 8.1.2.2 :

Un point d'extrémité NE DOIT PAS générer un message HTTP / 2 contenant des champs d'en-tête spécifiques à la connexion; tout message contenant des champs d'en-tête spécifiques à la connexion DOIT être traité comme mal formé (Section 8.1.2.6) .... champs d'en-tête spécifiques à la connexion, tels que Keep-Alive, Proxy-Connection, Transfer-Encoding et Upgrade

Il me semble un bug car Apache ne devrait pas envoyer cet en-tête avec HTTP / 2.

Je suppose que vous avez une configuration comme celle-ci

Protocols h2 h2c http/1.1

Étant donné que les navigateurs ne prennent pas en charge HTTP / 2 sans TLS de toute façon et qu'aucun en-tête de mise à niveau n'est nécessaire avec HTTP / 2 sur TLS, je vous recommande de remplacer cette configuration par

Protocols h2 http/1.1

Cela désactive la prise en charge du protocole HTTP / 2 inutile sans TLS mais devrait, espérons-le, se débarrasser de l'en-tête de mise à niveau de cette façon car cela n'est nécessaire que pour la mise à niveau de HTTP simple vers HTTP / 2 standard.

EDIT: selon le commentaire de l'OP, changer la Protocolsconfiguration n'a pas aidé. Il était nécessaire de contourner explicitement ce comportement (ie bug) de mod_http2en supprimant l'en- Upgradetête:

Header unset Upgrade
Steffen Ullrich
la source
3
Je vous remercie! J'ai en effet eu la configuration suivante: # 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> suivant votre recommandation et en changeant pour Protocols h2 http/1.1ne pas supprimer l'en-tête de mise à niveau, j'ai donc conservé la ligne Protocoles telle quelle et ajouté ce qui suit: Header unset Upgradepour supprimer l'en-tête. Je ne peux pas dire que je suis à 100% au courant de ce qui / pourquoi se passe ici, mais maintenant ça marche bien aussi dans Safari :-)
jola
@jola: merci pour les commentaires. Je l'ai inclus dans la réponse.
Steffen Ullrich
3

Je pense que c'est un problème Safari plutôt qu'un problème AWS / SSL. La recherche de cette erreur obtient de très nombreux résultats sur Google.

Tout se vérifie avec le site Web selon le test SSL Shopper et SSL Labs Test .

J'ai trouvé cette solution possible au problème.

La solution consistait à aller dans les préférences de Safari, sous Confidentialité et à répertorier tous les détails. Cela a fourni un journal de tous les sites où des cookies, etc. avaient été utilisés. J'ai trouvé la page du domaine MétéoMédia et j'en ai effacé tout le contenu. J'ai ensuite pu recharger la page MétéoMédia sans aucun problème. Je suppose que cela fonctionnerait pour d'autres sites singuliers similaires.

Il y a aussi cela qui pourrait être fait avec Apache.

Tim
la source
Oui, j'ai googlé cela, mais je n'ai rien trouvé qui s'applique directement (afaiu). J'ai lu la solution proposée pour nginx mais je ne sais pas comment / si cela s'applique à apache.
jola
Apache pourra sans aucun doute supprimer l'en- tête "Upgrade" , ce que fait Nginx.
Tim