421 Solicitação mal direcionada

10

Ocasionalmente, recebo o seguinte erro 421:

Solicitação mal direcionada

O cliente precisa de uma nova conexão para esta solicitação, pois o nome do host solicitado não corresponde à SNI (Server Name Indication) em uso para esta conexão.

No entanto, a atualização do navegador apaga o erro e a página é carregada normalmente. A próxima vez que carregar a página não produzirá nenhum erro e, como tal, o padrão parece bastante aleatório. O único padrão que vejo é que isso pode acontecer Quando redireciono uma página usando o cabeçalho ("Localização:". $ Url);

Eu tenho um certificado de vários domínios PositiveSSL da Comodo. Meus servidores são o Apache em um serviço de hospedagem compartilhada, portanto não tenho acesso à configuração.

Carrego páginas de um domínio e, dentro da página, há links para um segundo domínio no certificado.

Tudo o que li sobre esse erro parece indicar que esse problema está relacionado a um certificado de vários domínios.

O que eu gostaria de saber é se existe algo no lado da codificação da página da web (php) que pode causar isso (e pode ser corrigido) ou se é um erro de configuração ou possivelmente um erro do servidor e apenas meu serviço de hospedagem pode consertá-lo.

Até agora, meu serviço de hospedagem não conseguiu fornecer nada e solicitou a ligação com a hora exata em que acontece a seguir, para que eles possam pesquisar. Qualquer ajuda seria apreciada, pois não estou muito confiante de que eles possam descobrir isso.

ATUALIZAÇÃO Ok, quase alguns anos depois e decidiu que era hora de lidar com isso. Consegui resolver a maioria dos problemas removendo meus domínios estáticos que exibiam imagens e javascript. No entanto, eu ainda estava usando um segundo domínio para parte desse conteúdo e o Safari em particular ainda estava me causando problemas.

Eu fiz mais pesquisas e me deparei com outro artigo que fala sobre isso aqui . Exatamente o que @Kevin descreve. O artigo confirmou que isso acontece no Safari. Então, seguindo o conselho, comecei a obter certificados separados para cada domínio. Estou em um host compartilhado (Webhostinghub) e descobri que agora eles oferecem SSL grátis (AutoSSL) que é renovado automaticamente. Parecia bom demais para ser verdade. Eles me prepararam com 5 certificados gratuitos. Por enquanto, tudo bem. Eu posso até tentar reativar os domínios estáticos para testar. Se tudo funcionar, economizarei $ para inicializar como bônus e deixarei meus certificados Comodo expirarem em julho.

mseifert
fonte
Você está hospedando vários sites no mesmo servidor Apache E usando o mesmo certificado SSL E o erro ocorre ao alternar entre esses nomes de domínio?
John Hanley
Se a resposta for SIM, verifique se o endereço IP de cada domínio é mapeado para o mesmo servidor virtual. Se SIM, você tem duas opções (que eu posso pensar): 1) Emita certificados SSL separados para cada nome de domínio. 2) Mova os servidores da Web para cada domínio para estar em servidores diferentes (endereços IP diferentes). Como você está em hospedagem compartilhada, a opção 1 é provavelmente a melhor solução. Você pode testar esta solução usando o Let's Encrypt para emitir vários certificados gratuitos para instalar nos outros servidores da web.
John Hanley
Pergunte ao seu provedor de hospedagem se ele pode desativar o mod_http2.
John Hanley
@ JohnHanley - re # 1, sim, é o mesmo SSL com 6 domínios. Não é fácil dizer exatamente quando o erro ocorre. O cenário principal é que eu estou em um domínio puxando conteúdo (imagens e js) de outros dois domínios. Re # 2: O endereço IP é definitivamente o mesmo - eu concluo emitindo certificados separados, cada nome de domínio seria muito mais caro. Eu olhei para o Let's Encrypt, mas ele não é suportado pelo meu provedor. Meu provedor nos últimos 6 meses ofereceu certificados gratuitos; portanto, quando a renovação ocorrer neste mês, mudarei e ver o que acontece. Re # 3 - eles não podem desativar o mod_http2. Graças
mseifert
Na verdade, todos os provedores oferecem suporte ao Let's Encrypt, a menos que eles sejam especificamente bloqueados. Os certificados SSL são os mesmos, não importa onde você os obtenha. A única diferença é o tipo de validação (DV, OV, EV) e o formato / pacote do arquivo. O Apache é tão popular que todos os apoiam. Desde que o seu fornecedor suporte o upload de seu próprio certificado (certificado e chave privada), você pode usar a validação de DNS para contorná-los. Se eles não suportarem o upload de seu próprio certificado, eu trocaria de fornecedor.
John Hanley

Respostas:

13

Isso é causado pela seguinte sequência de eventos:

  1. O servidor e o cliente suportam e usam HTTP / 2.
  2. O cliente solicita uma página em foo.example.com.
  3. Durante a negociação do TLS, o servidor apresenta um certificado válido para ambos foo.example.come bar.example.com(e o cliente o aceita). Isso pode ser feito com um certificado curinga ou um certificado SAN.
  4. O cliente reutiliza a conexão para fazer uma solicitação bar.example.com.
  5. O servidor não pode ou não está disposto a oferecer suporte à reutilização de conexão entre domínios (por exemplo, porque você configurou o SSL de maneira diferente e o Apache deseja forçar uma renegociação de TLS) e serve o HTTP 421.
  6. O cliente não tenta novamente automaticamente com uma nova conexão (consulte, por exemplo, o bug do Chrome # 546991 , agora corrigido). O RfC relevante diz que o cliente PODE tentar novamente, não que DEVE ou DEVE. Falha ao tentar novamente não é particularmente amigável, mas pode ser desejável para uma ferramenta de depuração ou biblioteca HTTP.

O evento nº 6 está fora de seu controle, mas, dependendo do software do servidor, o nº 5 pode ser corrigido. Consulte a documentação HTTP / 2 do servidor para obter mais informações sobre como e quando ele envia HTTP 421. Como alternativa, você pode emitir certificados separados para cada domínio, mas isso cria mais sobrecarga administrativa e pode não valer a pena. Você também pode desativar completamente o HTTP / 2, mas isso provavelmente é um exagero na maioria dos casos.

Kevin
fonte
Eu tenho um certificado de domínio múltiplo Comodo PositiveSSL - que é realmente um único certificado SSL. Ir para separar certificados é um esforço e / ou despesa significativo neste momento. Os principais problemas surgiram com a tentativa de ter domínios estáticos sem culinária para servir minhas imagens. Não valia o número de 421 que eu estava recebendo. Por enquanto, desabilitei os domínios estáticos. Ainda tenho algum compartilhamento de recursos entre domínios, mas o número de 421s caiu drasticamente. Atualmente não vale a suposta eficiência. Algum dia, testarei sua recomendação quando tiver mais tempo.
Mseifert #
Obrigado pela explicação detalhada. Enquanto isto é um grande problema chato (e você só percebe isso quando usando o Safari, em grande parte), acho que a cadeia de eventos que levam a este problema bastante interessante :)
fritzmg
1

Talvez isso seja útil para alguém.

Eu recebi esse erro quando tentei alterar minha configuração de host virtual apache para HTTPS, mas alterei apenas a porta de 80 para 443 e esqueci de adicionar

   SSLEngine on
   SSLCertificateFile "/opt/lampp/htdocs/localhost.crt"
   SSLCertificateKeyFile "/opt/lampp/htdocs/localhost.key"

Configuração causando erro 421:

<VirtualHost mydoamin.local:443>   <-- fistly I 
       DocumentRoot "/opt/lampp/htdocs/mydomain/"
       ServerName www.mydomain.local
</VirtualHost>

A configuração correta:

<VirtualHost mydoamin.local:443>
       DocumentRoot "/opt/lampp/htdocs/mydomain/"
       ServerName www.mydomain.local
       SSLEngine on
       SSLCertificateFile "/opt/lampp/htdocs/localhost.crt"
       SSLCertificateKeyFile "/opt/lampp/htdocs/localhost.key"
</VirtualHost>
Radek Daniluk
fonte
-1

Eu tive o mesmo problema. Mudar para dois SSLs de slot único fez o truque.

Olivier
fonte