Ssl

HAProxy 作為已啟用 ssl 的後端的反向代理和暴露在埠 80 中的後端的 SSL 終止符

  • June 25, 2019

我有 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 連接,如果它不能為請求的域提供有效的證書,則失敗。

在我看來,您有幾個簡單的選擇:

  1. 在“聲納”和您擁有證書的任何未來服務前面設置一個單獨的反向代理。

  2. 為 *.ci.example.edu 購買萬用字元證書以在前端使用,並指出一個 CA 證書以允許 HAProxy 驗證後端伺服器提供的證書。

編輯添加:HAProxy 很高興允許您定義多個偵聽器證書,因此您可以使用單個前端輕鬆偵聽多個域的請求,只要客戶端了解如何在提供的證書中進行選擇 - 所有現代和符合標準的軟體都會這樣做.

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