Https

HAProxy 需要特定 url 上的客戶端證書並將其轉發到後端

  • July 4, 2017
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 }

…這將使證書成為可選,但如果尚未提供證書,則拒絕具有此路徑前綴的請求。

同樣,技術上有效,但不一定是您真正需要的。

引用自:https://serverfault.com/questions/859285