HTTPS не работает с Safari

16

У меня есть экземпляр EC2 с Apache в качестве веб-сервера (и Wildfly в качестве сервера приложений, хотя я не уверен, что это как-то связано с этой проблемой). Перед EC2 у меня есть балансировщик нагрузки, который завершает HTTPS и применяет сертификат SSL.

HTTP и HTTPS отлично работают в Chrome, но, к сожалению, не в Safari. Доступ к http://test.papereed.com работает нормально, но доступ к https://test.papereed.com дает ошибку

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

Я посмотрел в / etc / httpd / logs / error_log и / etc / httpd / logs / access_log, а также в консоли Safari, не найдя никаких подсказок для решения проблемы. И это о том, как далеко зашло мое знание :-( Любые намеки, как отследить эту проблему, будут высоко оценены.

Йола
источник

Ответы:

22

curl (если он скомпилирован с поддержкой HTTP / 2) показывает ту же проблему, но показывает причину:

Ошибка http2: получено недопустимое поле заголовка HTTP: тип фрейма: 1, поток: 1, имя: [обновление], значение: [h2, h2c]

Похоже, ваш сервер предлагает обновление до HTTP / 2, даже если соединение уже установлено с HTTP / 2 - что не имеет смысла. Мало того, это явно запрещено. Из RFC 7540 раздел 8.1.2.2 :

Конечная точка НЕ ​​ДОЛЖНА генерировать сообщение HTTP / 2, содержащее поля заголовка для конкретного соединения; любое сообщение, содержащее поля заголовка, относящиеся к соединению, ДОЛЖНО рассматриваться как некорректные (Раздел 8.1.2.6) .... поля заголовка, относящиеся к соединению, такие как Keep-Alive, Proxy-Connection, Transfer-Encoding и Upgrade

Это выглядит для меня ошибкой, так как Apache не должен отправлять этот заголовок с HTTP / 2.

Я предполагаю, что у вас есть такая конфигурация

Protocols h2 h2c http/1.1

Учитывая, что браузеры в любом случае не поддерживают HTTP / 2 без TLS и что заголовок Upgrade не требуется с HTTP / 2 по TLS, я рекомендую заменить эту конфигурацию на

Protocols h2 http/1.1

Это отключает поддержку ненужного HTTP / 2 без TLS, но следует надеяться, что таким образом следует избавиться от заголовка Upgrade, поскольку это необходимо только для обновления с простого HTTP до простого HTTP / 2.

РЕДАКТИРОВАТЬ: в соответствии с комментарием ОП изменение Protocolsконфигурации не помогло. Необходимо было явно обойти это поведение (то есть ошибку) mod_http2, удалив Upgradeзаголовок:

Header unset Upgrade
Штеффен Ульрих
источник
3
Спасибо! У меня действительно был следующий конфиг: # 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> Следуя вашей рекомендации и изменив на, Protocols h2 http/1.1заголовок обновления не удалялся, поэтому вместо этого я сохранил строку «Протоколы» как есть и добавил следующее: Header unset Upgradeудалить заголовок. Не могу сказать, что я на 100% уверен в том, что / почему происходит здесь, но теперь он отлично работает и в Safari :-)
jola
@jola: спасибо за отзыв. Я включил это в ответ.
Штеффен Ульрих
3

Я думаю, что это проблема Safari, а не проблема AWS / SSL. Поиск этой ошибки дает много, много результатов в Google.

Все проверяется на сайте в соответствии с тестом SSL Shopper и SSL Labs Test .

Я нашел это возможное решение проблемы.

Решением было перейти в настройки Safari в разделе «Конфиденциальность» и перечислить все детали. Это предоставило журнал всех сайтов, где использовались файлы cookie и т. Д. Я нашел страницу домена Weather Network и очистил от нее весь контент. Затем я смог перезагрузить страницу Weather Network без проблем. Я предполагаю, что это будет работать для других подобных сайтов.

Также есть то, что можно сделать с помощью Apache.

Тим
источник
Да, я гуглил это, но не нашел ничего, что имеет прямое отношение (afaiu). Я прочитал предложенное решение для nginx, но я не уверен, как / если это применимо для apache.
Джола
Apache, несомненно, сможет удалить заголовок «Upgrade» , и это все, что делает Nginx.
Тим