我的两个站点都有HAProxy,其中一个是公共站点,另一个是私有站点。
www.mysite.com private.mysite.com
自动取款机,我正在像这样使用haproxy:
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
这应该做的是索取客户端证书(可选)并继续。如果域不是www.example.com,并且访问者不能提供正确的证书,或者路径是/ ghost /,并且访问者不能提供正确的证书,则应将其重定向到https://www.example.com。
到目前为止,一切正常。但是,我收到Mac用户使用Safari浏览我的网站的投诉,他们在https://www.example.com/上浏览时不断询问他们的证书,而例如Firefox仅在浏览https://private.example时询问。.com /或https://www.example.com/ghost/。
显然,这就是Safari的工作方式,因此我无法解决。我的想法是使用SNI在不同的前端之间进行划分
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
当然那是行不通的,因为
一个。我不能有两个前端仅使用一个公共IP b侦听端口443。我还没有找到说“ use_frontend if domain_www”之类的方法。(仅use_backend或use-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
这行得通,但是这里的问题是haproxy-private要求提供客户端证书,但请求没有到达浏览器。haproxy-sni以某种方式放弃了该请求。
另外,我现在有三台haproxy服务器,这是不理想的(尽管如果找不到更好的解决方案,这是一个可能的选择)。
最好我想要这样的东西(组成..不知道真正的选择)
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
...
我希望有人可以帮助我...