18 votes

HTTPS ne fonctionne pas avec Safari

J'ai une instance EC2 avec Apache comme serveur web (et Wildfly comme serveur d'applications, bien que je ne sois pas sûr que cela ait un rapport avec ce problème). En face de l'EC2, j'ai un équilibreur de charge qui termine le HTTPS et applique le certificat SSL.

HTTP et HTTPS fonctionnent bien dans Chrome, mais malheureusement pas dans Safari. Accès à http://test.papereed.com fonctionne bien, mais l'accès à 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 d'indice pour résoudre le problème. Et c'est à peu près tout ce que je sais sur le sujet :-( Toute indication sur la façon de résoudre ce problème serait très appréciée.

27voto

Steffen Ullrich Points 11972

Curl (s'il a été compilé avec le support HTTP/2) présente le même problème mais en montre la raison :

Erreur http2 : Un champ d'en-tête HTTP non valide a été reçu : type de trame : 1, stream : 1, name : [upgrade], value : [h2,h2c]

Il semble que votre serveur propose une mise à niveau vers HTTP/2 alors que la connexion est déjà effectuée avec HTTP/2 - ce qui n'a aucun sens. De plus, c'est explicitement interdit. À partir de RFC 7540 section 8.1.2.2 :

Un point de terminaison 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és comme des malformations (Section 8.1.2.6).... champs d'en-tête spécifiques à la connexion, tels que Keep-Alive, Pression, etc. champs d'en-tête spécifiques à la connexion, tels que Keep-Alive, Proxy-Connection, Transfer-Encoding, et Mise à niveau

Il me semble qu'il s'agit d'un bug car Apache ne devrait pas envoyer cet en-tête avec HTTP/2.

Je pense que vous avez une configuration comme celle-ci

Protocols h2 h2c http/1.1

Étant donné que les navigateurs ne supportent pas HTTP/2 sans TLS de toute façon et qu'aucun en-tête Upgrade 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 de l'inutile HTTP/2 sans TLS, mais devrait permettre de se débarrasser de l'en-tête Upgrade de cette manière, puisqu'il n'est nécessaire que pour passer de HTTP simple à HTTP/2 simple.

EDIT : d'après le commentaire de l'OP changeant le Protocols n'a pas aidé. Il était nécessaire de contourner explicitement ce comportement (i.e. bug) de mod_http2 en supprimant le Upgrade en-tête :

Header unset Upgrade

4 votes

Merci. J'avais en effet 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> En suivant votre recommandation et en changeant pour Protocols h2 http/1.1 n'a pas supprimé l'en-tête de mise à niveau, j'ai donc conservé la ligne Protocoles telle quelle et ajouté ce qui suit : Header unset Upgrade pour enlever l'en-tête. Je ne peux pas dire que je suis à 100% au courant de ce qui se passe ici, mais maintenant cela fonctionne bien dans Safari aussi :-)

0 votes

@jola : merci pour ce commentaire. Je l'ai inclus dans la réponse.

3voto

Tim Points 28848

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

Tout est en ordre avec le site web selon le Test SSL Shopper y Test SSL Labs .

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

La solution a été d'aller dans les préférences de Safari, sous Confidentialité et de lister tous les détails. Cela fournit un journal de tous les sites où des cookies, etc. ont été utilisés. J'ai trouvé la page du domaine Weather Network et en ai effacé tout le contenu. contenu de celle-ci. J'ai ensuite été en mesure de recharger la page Weather Network sans problème. Je suppose que cela fonctionnerait pour d'autres sites singuliers similaires similaires.

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

0 votes

Oui, j'ai cherché sur Google mais je n'ai rien trouvé qui s'applique directement (afaiu). J'ai lu la solution proposée pour nginx mais je ne suis pas sûr de savoir comment/si cela s'applique à apache.

0 votes

Apache sera sans doute en mesure de supprimer la "En-tête "Upgrade ce qui est tout ce que fait Nginx.

0voto

Ano Points 191

Nginx : Header unset Upgrade; ne fonctionne pas si vous donnez une procuration à votre demande. proxy_hide_header Upgrade; à la place.

0 votes

Merci. Il m'a aidé à configurer Nginx et Apache. Sans proxy_hide_header Upgrade; je pouvais accéder https://my.example.com/gallery/ avec Chrome mais pas avec Safari et non avec curl . curl -4 --http2 -I -v https://my.example.com/gallery/ signalé * http2 error: Invalid HTTP header field was received: frame type: 1, stream: 1, name: [upgrade], value: [h2,h2c] * HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1) mais après avoir fixé proxy_hide_header cela fonctionne.

0voto

Jaber Al Nahian Points 101

Après avoir défini les directives suivantes dans Apache :

Header unset Upgrade

et suivant dans la directive NGinx :

proxy_hide_header Upgrade;

Le problème avec safari a disparu.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X