두 사이트에 대해 HAProxy가 있으며 그 중 하나는 공개 사이트이고 다른 하나는 비공개 사이트입니다.
www.mysite.com private.mysite.com
Atm, 나는 다음과 같이 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가 하나 인 포트 443에서 수신 대기하는 프런트 엔드를 두 대 가질 수 없습니다. b. "domain_www 인 경우 use_frontend"또는 이와 유사한 방법을 아직 찾지 못했습니다. (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가 요청을 삭제합니다.
또한 이제는 바람직하지 않은 3 개의 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
...
누군가가 나를 도울 수 있기를 바랍니다 ...