Ho HAProxy per i miei due siti, uno pubblico e uno privato.
www.mysite.com private.mysite.com
Atm, sto usando haproxy in questo modo:
frontend mysite_https
bind *.443 ssl crt /etc/mycert.pem ca-file /etc/myca.pem verify optional no-sslv3
mode http
acl domain_www hdr_beg(host) -i www.
acl domain_private hdr_beg(host) -i private.
acl path_ghost path_beg /ghost/
acl clientcert ssl_c_used
redirect location https://www.example.com if path_ghost !clientcert
redirect location https://www.example.com if !domain_www !clientcert
use_backend bknd_private if domain_private
use_backend bknd_www if domain_www
default_backend bknd_www
Quello che dovrebbe fare è chiedere un certificato client (opzionale) e procedere. Se il dominio non è www.example.com e il visitatore non può fornire il certificato giusto o il percorso è / ghost / e il visitatore non può fornire il certificato giusto, deve essere reindirizzato a https://www.example.com
Finora funziona bene. Tuttavia, ho ricevuto lamentele da parte degli utenti Mac che navigano nel mio sito con Safari che continuano a ricevere il certificato quando navigano su https://www.example.com/ mentre ad esempio Firefox chiede solo quando navigano su https: //private.example .com / o https://www.example.com/ghost/ .
Apparentemente è così che funziona Safari, quindi non posso risolverlo. La mia idea era di usare SNI per dividere tra frontend diversi
frontend mysite_https
bind *.443 ssl crt /etc/mycert.pem no-sslv3
frontend private_https
bind *.443 ssl crt /etc/mycert.pem ca-file /etc/myca.pem verify optional no-sslv3
Certo che non funziona perché
un. Non posso avere due frontend in ascolto sulla porta 443 con un solo IP pubblico b. Non ho ancora trovato un modo per dire "use_frontend if domain_www" o qualcosa del genere. (Solo use_backend o use-server)
Ho anche provato a farlo con tre server haproxy
frontend haproxy-sni
bind *:443 ssl crt /etc/mycert.pem no-sslv3
mode tcp
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
acl domain_www ssl_fc_sni_end -i www.example.com
use-server server1 haproxy-private.lan if !domain_www
use-server server2 haproxy-public.lan if domain_www
Funziona, il problema qui è che haproxy-private richiede il certificato client, ma la richiesta non raggiunge il browser. In qualche modo haproxy-sni elimina la richiesta.
Inoltre, ora ho tre server haproxy che non sono desiderabili (anche se un'opzione possibile se non trovo una soluzione migliore).
Preferibilmente vorrei qualcosa del genere (inventato .. non conosco le opzioni reali)
frontend mysite_https
bind *.443 ssl crt /etc/mycert.pem no-sslv3
mode http
acl domain_www hdr_beg(host) -i www.
acl domain_private hdr_beg(host) -i private.
acl path_ghost path_beg /ghost/
ssl_options ca-file /etc/myca.pem verify optional if !www_domain # made up!
ssl_options ca-file /etc/myca.pem verify optional if !path_ghost # made up!
acl clientcert ssl_c_used
redirect location https://www.example.com if path_ghost !clientcert
redirect location https://www.example.com if !domain_www !clientcert
...
Spero che qualcuno mi possa aiutare con questo...