Tôi có HAProxy cho hai trang web của mình, một trong số đó là công khai và một trang riêng tư.
www.mysite.com private.mysite.com
Atm, tôi đang sử dụng haproxy như thế này:
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
Điều này nên làm là yêu cầu chứng chỉ ứng dụng khách (tùy chọn) và tiến hành. Nếu tên miền không phải là www.example.com và khách truy cập không thể cung cấp chứng chỉ phù hợp hoặc đường dẫn là / ghost / và khách truy cập không thể cung cấp chứng chỉ phù hợp, thì nên chuyển hướng đến https://www.example.com
Cho đến nay, điều này hoạt động tốt. Tuy nhiên, tôi đã nhận được khiếu nại của người dùng Mac khi duyệt trang web của tôi với Safari rằng họ cứ bị yêu cầu chứng nhận khi duyệt trên https://www.example.com/ trong khi đó, Firefox chỉ hỏi khi duyệt https: //private.example .com / hoặc https://www.example.com/ghost/ .
Rõ ràng đó là cách Safari hoạt động nên tôi không thể khắc phục điều đó. Ý tưởng của tôi là sử dụng SNI để phân chia giữa các tiền tuyến khác nhau
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
Tất nhiên điều đó không hiệu quả vì
a. Tôi không thể có hai giao diện nghe trên cổng 443 chỉ với một IP công khai b. Tôi chưa tìm thấy cách nào để nói "use_frontend if domain_www" hoặc đại loại như thế. (Chỉ use_backend hoặc use-server)
Tôi cũng đã thử làm điều đó với ba máy chủ 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
Điều này hoạt động, vấn đề ở đây là haproxy-private yêu cầu chứng chỉ ứng dụng khách, nhưng yêu cầu không đến được trình duyệt. Bằng cách nào đó haproxy-sni bỏ yêu cầu.
Ngoài ra, bây giờ tôi có ba máy chủ haproxy không mong muốn (mặc dù là một tùy chọn khả thi nếu tôi không thể tìm ra giải pháp tốt hơn).
Tốt nhất là tôi muốn một cái gì đó như thế này (tạo thành .. không biết các tùy chọn thực sự)
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
...
Tôi hy vọng ai đó có thể giúp tôi với điều này ...