Saya memiliki HAProxy untuk dua situs saya, salah satunya publik dan satu pribadi.
www.mysite.com private.mysite.com
Atm, saya menggunakan haproxy seperti ini:
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
Apa yang harus dilakukan adalah meminta sertifikat klien (opsional) dan melanjutkan. Jika domain tersebut bukan www.example.com dan pengunjung tidak dapat memberikan sertifikat yang tepat atau jalurnya adalah / ghost / dan pengunjung tidak dapat memberikan sertifikat yang tepat, itu harus diarahkan ke https://www.example.com
Sejauh ini, ini berfungsi dengan baik. Namun, saya mendapat keluhan oleh pengguna Mac yang menelusuri situs saya dengan Safari bahwa mereka terus dimintai sertifikat ketika ada penjelajahan di https://www.example.com/ sedangkan misalnya Firefox hanya bertanya saat menjelajah https: //private.example .com / atau https://www.example.com/ghost/ .
Tampaknya itulah cara kerja Safari, jadi saya tidak bisa memperbaikinya. Ide saya adalah menggunakan SNI untuk membagi antara berbagai frontend
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
Tentu saja itu tidak berhasil karena
Sebuah. Saya tidak dapat memiliki dua frontend mendengarkan pada port 443 dengan hanya satu IP publik b. Saya belum menemukan cara untuk mengatakan "use_frontend if domain_www" atau sesuatu seperti itu. (Hanya use_backend atau use-server)
Saya juga mencoba melakukannya dengan tiga 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
Ini berfungsi, masalahnya di sini adalah haproxy-private meminta sertifikat klien, tetapi permintaan tersebut tidak mencapai browser. Entah bagaimana haproxy-sni menjatuhkan permintaan.
Juga, saya sekarang memiliki tiga server haproxy yang tidak diinginkan (walaupun merupakan opsi yang mungkin jika saya tidak dapat menemukan solusi yang lebih baik).
Lebih disukai saya ingin sesuatu seperti ini (dibuat-buat .. tidak tahu opsi yang sebenarnya)
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
...
Saya berharap ada orang yang bisa membantu saya dalam hal ini...
versi terbaru haproxy mendukung pengaturan yang disebut
crt-list
yang memungkinkan Anda menentukan pengaturan TLS berbeda berdasarkan sertifikat yang cocokAnda dapat menggunakannya seperti ini:
haproxy.conf:
crt-list.conf:
info lebih lanjut: https://cbonte.github.io/haproxy-dconv/1.9/configuration.html#5.1-crt-list
catatan tentang keamanan: selalu cocokkan nama host Anda (sensitif) dengan SNI
ssl_fc_sni
, bukan nama host HTTP. Kalau tidak, seorang penyerang mungkin dapat mem-bypass klien Anda dengan mengirimkan TLS SNIwww.example.org
tetapi tetapkan nama host HTTP menjadiprivate.example.org
!sumber
ca-file
pengaturan yang berbeda .