Ssl
HAProxy 作為已啟用 ssl 的後端的反向代理和暴露在埠 80 中的後端的 SSL 終止符
我有 4 台伺服器:
- 代理伺服器,
- $BK_SERVER_001,
- $BK_SERVER_002 和
- $BK_SERVER_003
“proxy_server”只有具有此配置的啟用 HAProxy 的服務:(請查看標記為 OPTION 1 和 OPTION 2 的行)
# StackOverflow global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3 defaults timeout connect 10s timeout client 30s timeout server 30s log global mode http option httplog option dontlognull # ***************** port 80 defs ************ frontend http_in mode http option httplog bind *:80 option forwardfor acl host_goose hdr(host) -i www.example.edu redirect scheme https code 301 if !host_goose use_backend http_goose if host_goose backend http_goose mode http server sonar $BK_SERVER_003:8080 # ***************** port 443 defs ************ frontend https_in mode tcp option tcplog # With this one, all works except sonar (OPTION 1) # bind *:443 # With this one, only works sonar (OPTION 2) bind *:443 ssl crt sonar.pem acl tls req.ssl_hello_type 1 tcp-request inspect-delay 5s tcp-request content accept if tls acl host_server001 req.ssl_sni -i opengrok.ci.example.edu acl host_server002 req.ssl_sni -i gitlab.ci.example.edu acl host_server003 req.ssl_sni -i jenkins.ci.example.edu acl host_server004 req.ssl_sni -i nexus.ci.example.edu acl host_server005 req.ssl_sni -i rancher.ci.example.edu acl host_server006 req.ssl_sni -i reports.ci.example.edu acl host_server007 hdr(host) -i sonar.ci.example.edu use_backend https_server001 if host_server001 use_backend https_server002 if host_server002 use_backend https_server003 if host_server003 use_backend https_server004 if host_server004 use_backend https_server005 if host_server005 use_backend https_server006 if host_server006 use_backend https_server007 if host_server007 #opengrok backend https_server001 mode tcp server server001 $BK_SERVER_001:28443 #gitlab backend https_server002 mode tcp server server002 $BK_SERVER_002:10443 #jenkins backend https_server003 mode tcp server server003 $BK_SERVER_001:7443 #nexus backend https_server004 mode tcp server server004 $BK_SERVER_001:8443 #rancher backend https_server005 mode tcp server server005 $BK_SERVER_002:9443 #reports backend https_server006 mode tcp server server006 $BK_SERVER_001:4443 #sonar backend https_server007 mode http server server007 $BK_SERVER_001:9000
對於選項 2,HAProxy 使用給定證書成功發布了服務“聲納”,但是,其餘服務正在嘗試使用該證書。由於其他服務已經在其相應的後端啟用了 SSL,因此我沒有他們的證書。
如果我使用選項 1,HAProxy 會成功發布除“聲納”服務之外的所有已經 ssl 後端服務,因為它需要我僅在 proxy_server 級別擁有的證書。
如果(就像我說的)其中一些服務已經受到保護,但其他一些服務將由 HAProxy 保護,那麼是否可以使用 SSL 保護所有服務,而我只有一個 SSL 可以訪問“聲納”服務?如何?
另請注意,我沒有對 $BK_SERVER_xxx 伺服器的 ssh 訪問權限,並且所有 DNS 都將它們的名稱指向“proxy_server”。
我認為您無法實現您想要做的事情:如您所見,一旦您提供證書,偵聽器就會停止“盲目”將加密流量直接代理到正確的後端,而是嘗試使用提供的證書終止所有客戶端 TLS 連接,如果它不能為請求的域提供有效的證書,則失敗。
在我看來,您有幾個簡單的選擇:
在“聲納”和您擁有證書的任何未來服務前面設置一個單獨的反向代理。
為 *.ci.example.edu 購買萬用字元證書以在前端使用,並指出一個 CA 證書以允許 HAProxy 驗證後端伺服器提供的證書。
編輯添加:HAProxy 很高興允許您定義多個偵聽器證書,因此您可以使用單個前端輕鬆偵聽多個域的請求,只要客戶端了解如何在提供的證書中進行選擇 - 所有現代和符合標準的軟體都會這樣做.