HTTPS não funciona com o Safari

15

Eu tenho uma instância do EC2 com o Apache como servidor da Web (e o Wildfly como servidor de aplicativos, embora não tenha certeza de que tenha algo a ver com esse problema). Na frente do EC2, tenho um balanceador de carga que encerra o HTTPS e aplica o certificado SSL.

HTTP e HTTPS funcionam bem no Chrome, mas infelizmente não no Safari. Acessar http://test.papereed.com funciona bem, mas acessar https://test.papereed.com dá o erro

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

Procurei em / etc / httpd / logs / error_log e / etc / httpd / logs / access_log e também no console do Safari sem encontrar nenhuma dica para resolver o problema. E é sobre o quanto meu conhecimento vai :-( Qualquer dica de como rastrear esse problema seria muito apreciada.

jola
fonte

Respostas:

21

curl (se compilado com suporte a HTTP / 2) exibe o mesmo problema, mas mostra o motivo:

erro http2: campo inválido do cabeçalho HTTP foi recebido: tipo de quadro: 1, fluxo: 1, nome: [upgrade], valor: [h2, h2c]

Parece que seu servidor está oferecendo uma atualização para HTTP / 2, mesmo que a conexão já tenha sido feita com HTTP / 2 - o que não faz sentido. Não é só isso, é explicitamente proibido. Na seção 8.1.2.2 do RFC 7540 :

Um terminal NÃO DEVE gerar uma mensagem HTTP / 2 contendo campos de cabeçalho específicos da conexão; qualquer mensagem que contenha campos de cabeçalho específicos da conexão DEVE ser tratada como malformada (Seção 8.1.2.6) .... campos de cabeçalho específicos da conexão, como Keep-Alive, Proxy-Connection, Transfer-Encoding e Upgrade

Parece-me um bug, já que o Apache não deve enviar esse cabeçalho com HTTP / 2.

Meu palpite é que você tem uma configuração como esta

Protocols h2 h2c http/1.1

Dado que os navegadores não suportam HTTP / 2 sem TLS e que nenhum cabeçalho de atualização é necessário com HTTP / 2 sobre TLS, recomendo que você substitua essa configuração por

Protocols h2 http/1.1

Isso desativa o suporte para o HTTP / 2 desnecessário sem TLS, mas espero que ele se livre do cabeçalho de atualização dessa maneira, pois isso é necessário apenas para a atualização de HTTP simples para HTTP / 2 simples.

EDIT: de acordo com o comentário do OP, alterar a Protocolsconfiguração não ajudou. Era necessário contornar explicitamente esse comportamento (ou seja, bug) mod_http2excluindo o Upgradecabeçalho:

Header unset Upgrade
Steffen Ullrich
fonte
2
Obrigado! Na verdade, eu tinha a seguinte configuração: # 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> Seguir a sua recomendação e alterar para Protocols h2 http/1.1não removeu o cabeçalho de atualização; portanto, mantive a linha de protocolos como está e adicionei o seguinte: Header unset Upgradepara remover o cabeçalho. Não posso dizer que estou 100% em cima do que / por que acontece aqui, mas agora ele funciona bem no Safari também :-) #
315
@ola: obrigado pelo feedback. Eu o incluí na resposta.
Steffen Ullrich
3

Acho que esse é um problema do Safari, e não um problema da AWS / SSL. A busca por esse erro obtém muitos, muitos resultados no Google.

Tudo é verificado no site de acordo com o teste SSL Shopper e o SSL Labs Test .

Encontrei esta possível solução para o problema.

A solução foi acessar as Preferências do Safari, em Privacidade e listar todos os detalhes. Isso forneceu um log de todos os sites em que cookies etc. foram usados. Encontrei a página de domínio da Weather Network e limpei todo o conteúdo dela. Consegui recarregar a página Weather Network sem problemas. Presumo que isso funcionaria para outros sites singulares semelhantes.

Há também isso que pode ser feito com o Apache.

Tim
fonte
Sim, pesquisei isso no Google, mas não encontrei nada que se aplica diretamente (afaiu). Eu li a solução proposta para o nginx, mas não sei como / se isso é aplicável ao apache.
jola
O Apache sem dúvida poderá excluir o cabeçalho "Upgrade" , que é tudo o que o Nginx está fazendo.
Tim