Https
HAProxy 需要特定 url 上的客戶端證書並將其轉發到後端
frontend front bind *:80 bind *:443 ssl crt /etc/haproxy/certs/server.pem ca-file /etc/haproxy/certs/id.crt verify required option tcplog mode http default_backend app backend app balance roundrobin cookie SERVERID insert option ssl-hello-chk mode http option httpclose option forwardfor option httpchk get /WebApi/help server app1 1.1.1.1:443 check ssl fall 1 rise 3 verify none cookie webA server app2 1.1.1.2:443 check ssl fall 1 rise 3 verify none cookie webB
對於某些頁面/login/idcard,我需要客戶端證書並將其發送到後端(IIS),後者將使用它進行身份驗證,我找不到在某些路徑上詢問證書的方法,並且證書轉發到後端也不起作用,以前配置使用“模式tcp”將所有內容轉發到IIS並且它正在工作,但我需要使用“acl”將具有特定路徑的請求轉發到另一台伺服器,但“acl”在https中不起作用所以它應該是http
你不能為某個路徑請求證書,因為在知道路徑之前TLS協商已經完成,所以一旦你知道了路徑,就為時已晚。
同樣,不可能“轉發”客戶端證書——如果這個代理在,
mode http
那麼有兩個 TLS 會話——一個在客戶端和代理之間,另一個在代理和後端伺服器之間。代理沒有客戶端證書的私鑰,因此它無法使用客戶端證書與後端協商 TLS。如果可以在不擁有私鑰的情況下使用某人的客戶端證書,那麼客戶端證書將毫無用處——證書也是公鑰,而公鑰是“公共的”,因為它們本身並不代表任何有價值的東西。可以通過使用第 5 層獲取將它們設置為代理中的 HTTP 請求標頭來轉發客戶端提供的證書的屬性,但這不太可能滿足需要查看實際證書的後端。
甚至可以將整個客戶端證書注入後端的請求標頭中……
http-request set-header X-Client-Certificate %[ssl_c_der,base64]
…但這不太可能在您描述的場景中使用。
同樣,您可以使用
bind ... ssl ... verify optional
而不是required
,然後阻止對特定路徑的請求,除非已經提供了證書…http-request deny if { path_beg /login/idcard } !{ ssl_fc_has_crt }
…這將使證書成為可選,但如果尚未提供證書,則拒絕具有此路徑前綴的請求。
同樣,技術上有效,但不一定是您真正需要的。