HAProxy requer certificado de cliente em determinado url e encaminha para o backend

1
frontend  front
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/server.pem ca-file /etc/haproxy/certs/id.crt verify required 
option tcplog
mode http    
default_backend app

backend app    
balance roundrobin
cookie SERVERID insert
option ssl-hello-chk
mode http
option httpclose
option forwardfor     
option httpchk get /WebApi/help
server  app1 1.1.1.1:443 check ssl fall 1 rise 3 verify none cookie webA
server  app2 1.1.1.2:443 check ssl fall 1 rise 3 verify none cookie webB

para determinada página / login / idcard eu preciso exigir certificado de cliente e enviá-lo para back-end (IIS), que irá usá-lo para autenticação, não consigo encontrar maneira de pedir certificado em determinado caminho e encaminhamento de certificado para back-end também não trabalhando, configuração anterior estava usando "modo tcp" que encaminha tudo para o IIS e estava funcionando, mas eu preciso usar "acl" para encaminhar pedido com determinado caminho para outro servidor, mas "acl" não está funcionando em https por isso deve ser http

    
por jetcarq q 04.07.2017 / 14:13

1 resposta

5

Você não pode solicitar um certificado para um determinado caminho, porque a negociação de TLS já foi concluída antes que o caminho seja conhecido. Portanto, quando você souber o caminho, será tarde demais.

Da mesma forma, não é possível "encaminhar" um certificado de cliente - se esse proxy estiver em mode http , haverá duas sessões TLS - uma entre cliente e proxy e outra entre proxy e servidor de backend . O proxy não possui a chave privada do certificado do cliente, portanto, não pode negociar o TLS com o backend usando o certificado do cliente. Se fosse possível usar o certificado de cliente de alguém sem estar em posse de sua chave privada, o certificado do cliente seria inútil - o certificado também é a chave pública e as chaves públicas são "públicas" porque, por si mesmas, não representam qualquer coisa de valor.

É possível encaminhar os atributos do certificado apresentado pelo cliente, definindo-os como cabeçalhos de solicitação HTTP no proxy usando layer 5 busca , mas isso provavelmente não satisfaria um back-end que precisa ver o certificado real.

É possível injetar todo o certificado do cliente em um cabeçalho de solicitação para o backend ...

http-request set-header X-Client-Certificate %[ssl_c_der,base64]

... mas é improvável que isso seja útil no cenário que você descreve.

Da mesma forma, você pode usar bind ... ssl ... verify optional em vez de required e, em seguida, bloquear solicitações para caminhos específicos, a menos que um certificado já tenha sido apresentado ...

http-request deny if { path_beg /login/idcard } !{ ssl_fc_has_crt }

... isso tornaria o certificado opcional, mas negaria solicitações com esse prefixo de caminho se um certificado ainda não tivesse sido apresentado.

Novamente, tecnicamente válido, mas não necessariamente o que você realmente precisa.

    
por 04.07.2017 / 18:08