A porta de serviço 443 sobre http cria 400 erros de solicitação inválida em vez de redirecionar

1

Então, para o bem da posteridade, estou tentando configurar meu servidor para que, mesmo quando alguém tentar ir para http: // domain.com:443, ele seja corretamente redirecionado para a versão https do site (https://// domain.com).

Ao testar algo como http: // domain.com:443, ele não redireciona corretamente para https: // domain.com, em vez disso, sou atingido por uma página de 400 Solicitações incorretas com o seguinte conteúdo:

Bad Request

Your browser sent a request that this server could not understand. Reason: You're speaking plain HTTP to an SSL-enabled server port. Instead use the HTTPS scheme to access this URL, please.

Apache/2.4.18 (Ubuntu) Server at sub.domain.com Port 443

Eu tentei incluir as seguintes linhas no meu 000-default.conf no <VirtualHost *:80> :

RewriteEngine On 
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]

Mas não funcionou.

Esse problema ocorre em todos os domínios, subdomínios e no próprio IP do servidor.

Possivelmente relacionado, tentando fazer uma execução seca de letsencrypt retorna o seguinte:

   Domain: domain.com
   Type:   connection
   Detail: Failed to connect to 123.123.123.123:443 for TLS-SNI-01
   challenge

Para cada domínio listado na pasta habilitada para sites.

    
por Bitz 18.09.2016 / 00:57

3 respostas

6

TL; TR: você não pode servir HTTP e HTTPS na mesma porta (443).

Embora seja possível, na teoria, descobrir com base nos primeiros dados do cliente, se o cliente estiver enviando uma solicitação HTTP (ou seja, GET .. ou similar) ou estiver iniciando um handshake TLS ( \x16\x03... ), a maioria da web servidores não fazem isso. Em vez disso, eles esperam que o cliente se comporte adequadamente, ou seja, use HTTP simples em uma porta (geralmente 80) e HTTPS em outra porta (geralmente 443).

Seu URL de http://example.com:443 está fazendo com que o navegador faça uma solicitação HTTP simples para a porta 443. Mas o servidor está esperando o TLS lá, o que significa que sua solicitação HTTP simples é inesperada. O Apache é, no mínimo, legal o suficiente para verificar se os dados de entrada para uma solicitação HTTP simples, nesse caso, podem oferecer uma descrição mais útil:

Reason: You're speaking plain HTTP to an SSL-enabled server port. Instead use the HTTPS scheme to access this URL, please.

Se você tentar esses pedidos com outros servidores, eles poderão fechar a conexão sem nenhum erro ou apenas travar porque ainda esperam obter um handshake TLS do cliente.

    
por 18.09.2016 / 05:56
2

O que você está realmente procurando é enviar cabeçalhos HSTS do servidor web de volta para os usuários, que dizem ao navegador para sempre acessar o site usando o TLS. Não há nenhum 301 redirect acontecendo, como você pode ver nas ferramentas de desenvolvimento em qualquer navegador.

Isso acontece com o Google, por exemplo. Depois de visitar o Google pela primeira vez, ele envia um cabeçalho HSTS e o navegador salva o cabeçalho em uma lista. Depois, quando você tentar se conectar ao google.com com http:// , o navegador alterará o método de conexão automaticamente para https:// sem nenhuma comunicação com o servidor remoto.

Este é mais um mecanismo de segurança para evitar ataques à camada de segurança.

    
por 21.09.2016 / 11:36
0

Nada que esteja dentro da seção <VirtualHost *:80> será processado quando você acessar o site usando a porta 443.

Teste habilitando a versão ssl do site padrão que vem com o apache2 e tente que conf dentro de <VirtualHost *:443>

    
por 18.09.2016 / 01:21