Eu encontrei uma solução para esse problema, que não requer servidores ou serviços adicionais. Eu não tenho certeza se isso não gera novos problemas. Para mim, parece funcionar agora.
A maneira como eu fiz isso, foi criar um frontend para cada domínio que exigisse diferentes configurações de SSL. Em seguida, defino a opção de ligação dessas interfaces para portas altas (elas não podem ser acessadas do público!).
Eu criei outro frontend escutando na porta: 443 para dividir o tráfego baseado em SNI, e configure os servidores backend para 127.0.0.1:highport.
Desta forma, criei uma espécie de loop no haproxy
[incoming]->[haproxy:443]->[haproxy:7000]->[www.intern.lan]
[incoming]->[haproxy:443]->[haproxy:8000]->[private.intern.lan]
Aqui está a parte da configuração.
frontend frnd_snipt # Frontend_SNI-PassThrough (snipt)
bind *:443 # Do not use bind *:8443 ssl crt etc....!
option tcplog
mode tcp
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
acl subdomain_is_www req_ssl_sni -i www.example.com
acl subdomain_is_www req_ssl_sni -i example.com
acl subdomain_is_private req_ssl_sni -i private.example.com
use_backend bknd_snipt_private if subdomain_is_private
use_backend bknd_snipt_www if subdomain_is_www
backend bknd_snipt_www
mode tcp # tcp mode must match the frontend mode - already set as default in [global]
server snipt-www 127.0.0.1:7000 # run without "check", otherwise haproxy checks itself all the time!
backend bknd_snipt_private
mode tcp
server snipt-private 127.0.0.1:8000 # also, don't add "ssl" when in tcp mode. "ssl" is an http mode option (result in "NO-SRV" when set in tcp)
##### NORMAL HAPROXY PART #####
frontend www_example_com # this frontend can be in tcp or http mode...
bind *:7000 ssl crt /etc/mycert.pem no-sslv3 # www. frontend with normal https
mode http
option httplog
frontend private_example_com
bind *:8000 ssl crt /etc/mycert.pem ca-file /etc/myca.pem verify optional no-sslv3 # private. frontend with client certificate request.
mode http
option httplog
... # whatever you have in your frontend
Se alguém tiver pensamentos sobre isso, ou qualquer ideia de por que isso pode ser uma má ideia, por favor me avise. Funciona, mas estou me perguntando por que use_frontend não é uma opção. Talvez porque seja algo que não deveria ser feito por qualquer motivo.