Ich habe HAProxy für meine beiden Websites, eine davon öffentlich und eine privat.
www.mysite.com private.mysite.com
Atm, ich benutze Haproxy wie folgt:
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
Fordern Sie dazu (optional) ein Client-Zertifikat an und fahren Sie fort. Wenn die Domain nicht www.example.com ist und der Besucher nicht das richtige Zertifikat bereitstellen kann oder der Pfad / ghost / ist und der Besucher nicht das richtige Zertifikat bereitstellen kann, sollte er zu https://www.example.com umgeleitet werden
Bisher funktioniert das gut. Ich habe jedoch Beschwerden von Mac-Benutzern erhalten, die meine Website mit Safari durchsuchen, dass sie beim Surfen auf https://www.example.com/ immer wieder nach dem Zertifikat gefragt werden, während Firefox beispielsweise nur beim Durchsuchen von https: //private.example fragt .com / oder https://www.example.com/ghost/ .
Anscheinend funktioniert Safari so, also kann ich das nicht beheben. Meine Idee war, SNI zu verwenden, um zwischen verschiedenen Frontends zu teilen
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
Das funktioniert natürlich nicht, weil
ein. Ich kann nicht zwei Frontends haben, die Port 443 mit nur einer öffentlichen IP abhören. B. Ich habe noch keine Möglichkeit gefunden, "use_frontend if domain_www" oder ähnliches zu sagen. (Nur use_backend oder use-server)
Ich habe es auch mit drei Haproxy-Servern versucht
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
Dies funktioniert, das Problem hierbei ist jedoch, dass haproxy-private nach dem Client-Zertifikat fragt, die Anforderung jedoch den Browser nicht erreicht. Irgendwie lässt Haproxy-Sni die Anfrage fallen.
Außerdem habe ich jetzt drei Haproxy-Server, was nicht wünschenswert ist (obwohl eine mögliche Option, wenn ich keine bessere Lösung finde).
Am liebsten hätte ich so etwas (erfunden .. kenne die wirklichen Möglichkeiten nicht)
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
...
Ich hoffe jemand kann mir dabei helfen ...