É possível que o HAProxy execute uma mistura de terminação e passagem SSL?

1

Estou trabalhando para analisar uma falha intermitente de balanceamento de carga em nosso aplicativo.

Anteriormente, estávamos usando o AWS Elastic Load Balancer na seguinte configuração:

HTTP 80 -> HTTP 80
HTTPS 443 -> HTTPS 443, presenting the same certificate as the backend IIS servers are

Agora percebemos que essa é uma configuração genial (tanto o LB e o servidor IIS fazendo a mesma criptografia ... o trabalho perdido), como começou a causar alguns problemas para nós. Especificamente, veremos intermitentemente uma solicitação para o pico do ELB em latência, obteremos 60 segundos completos (o tempo limite padrão) e informaremos um erro ao cliente. Passamos bastante tempo confirmando que o pico de latência não está relacionado a um atraso no processamento do aplicativo.

Como mencionado, agora percebemos que essa configuração é estranha. Por exemplo, uma configuração mais natural do ELB funciona bem:

HTTP 80 -> HTTP 80
TCP 443 -> TCP 443, straight passthrough, all encryption happening on the IIS backend

Diminuindo o zoom por um momento, ficamos curiosos se pudéssemos reproduzir a falha intermitente na configuração incorreta do HAProxy. Isso é ter a terminação HAProxy do SSL e, em seguida, iniciar outra conexão SSL completa com o servidor de backend. Novamente, percebemos que isso é bobagem, mas estamos investigando para fins de comparação da caixa preta que é ELB e HAProxy.

Aqui está a configuração simples que tentei:

frontend https_frontend
  bind *:443 ssl crt /etc/ssl/certs/ourpublicandprivatecert.pem
  mode http
  default_backend web_server
backend web_server
  mode http
  server s1 10.0.1.4:443 check

Então, ao navegar para o host HAProxy, obtemos:

504 Gateway Time-out

The server didn't respond in time.

Eu estou supondo que o HAProxy está pirando sobre a incompatibilidade no certificado, mas não consigo obter logs para confirmar isso. A outra possibilidade é que, por ser uma configuração tão estranha (misturando terminação e passagem SSL), o HAProxy simplesmente não suporta, em vez disso, forçá-lo a percorrer os caminhos mais seguros da terminação OR ou passagem.

Alguém tem alguma ideia?

    
por spicecat 18.07.2013 / 01:08

2 respostas

1

Naturalmente, você tem uma versão recente do HAProxy com suporte a OpenSSL integrado.

Parece que você precisa de alguns parâmetros extras para usar o back-end HTTPS. O HAProxy tenta a conexão HTTP normal por padrão, independentemente do número da porta.

O parâmetro ssl garante a conexão SSL:

server s1 10.0.1.4:443 ssl check check-ssl

O certificado do servidor não é verificado por padrão. Se você deseja verificar, é necessário adicionar verify required e ca-file <cafile> à linha do servidor.

Veja mais sobre as opções aqui: link

    
por 18.07.2013 / 13:52
0

Acho que há um erro em sua configuração de back-end. Tente em vez disso:

frontend https_frontend
  bind *:443 ssl crt /etc/ssl/certs/ourpublicandprivatecert.pem
  mode http
  default_backend web_server
backend web_server
  mode http
  server s1 10.0.1.4:80 check

A mudança é a porta! E também certifique-se de que seu servidor não está redirecionando da porta 80 para a 443 ou que irá confundir as coisas.

Uma vantagem que você obtém ao usar haproxy ou ELB para fazer a terminação SSL é que ela pode inserir cabeçalhos como X-Forwarded-For.

Se você estiver simplesmente passando pelo SSL usando a opção tcp e não estiver fazendo SSL no ELB ou com o HAProxy, não será possível inserir os cabeçalhos porque o fluxo é criptografado. Portanto, não há como o servidor da Web fazer algo inteligente com a solicitação e todas as conexões do cliente nos registros do servidor da Web parecerão que vieram do IP do servidor elb ou haproxy!

Portanto, não delegue criptografia ao backend, em vez disso, faça tudo na instância ELB ou HAProxy e faça uso do X-Forwarded-For.

    
por 31.03.2015 / 08:59