Nginx

通過 HAProxy 轉發 SSL 流量和身份驗證證書

  • September 9, 2020

我有一個來自客戶端的 nginx,我可以通過以下方式成功發布:

curl -v --cacert ca.crt --cert client.crt --key client.key -POST https://nginx:8443/api/ -H 'Content-Type: application/json' -H 'cache-control: no-cache' -d@test.json

現在我在 nginx 前面安裝了一個 haproxy,我試圖以同樣的方式進行 POST,但不成功:

curl -v --cacert ca.crt --cert client.crt --key client.key -POST http://haproxy:8443/api/ -H 'Content-Type: application/json' -H 'cache-control: no-cache' -d@test.json

錯誤:

<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx</center>

這是我的 haproxy 配置:

global
 log         127.0.0.1 local2
 chroot      /var/lib/haproxy
 pidfile     /var/run/haproxy.pid
 maxconn     4000
 user        haproxy
 group       haproxy
 daemon
 stats socket /var/lib/haproxy/stats

defaults
 mode                    tcp
 log                     global
 option                  tcplog
 option                  dontlognull
 option http-server-close
 option forwardfor       except 127.0.0.0/8
 option                  redispatch
 retries                 3
 timeout http-request    10s
 timeout queue           1m
 timeout connect         10s
 timeout client          1m
 timeout server          1m
 timeout http-keep-alive 10s
 timeout check           10s
 maxconn                 3000

frontend  main *:8443
 acl url_static       path_beg       -i /static /images /javascript /stylesheets
 acl url_static       path_end       -i .jpg .gif .png .css .js
 use_backend static          if url_static
 default_backend             app

backend static
 balance     roundrobin
 server      static 127.0.0.1:8443 

backend app
 mode       tcp
 balance     roundrobin
 server  nginx nginx01:8443            

我想通過 HAProxy 轉發 SSL 流量並將用於身份驗證的證書傳遞給 nginx。我知道擁有兩個 LB 沒有任何意義,但我無法修改 nginx 和後面的 api 伺服器,但客戶端將是內部的。正如您在這一點上看到的,我可以訪問 nginx,但 haproxy 不會將請求中的證書和密鑰傳遞給 nginx 後端。我錯過了什麼嗎?這是我可以實現的嗎?

ps:如果我在後端設置“ssl verify none”,我會得到“沒有發送所需的 SSL 證書”。如果我在後端設置“send-proxy”,我會從 nginx 收到“400 Bad Request”。

您需要將 ssl 配置添加到 haproxy 並設置一些將轉發到 nginx 的標頭。

# your other config from above

backend app
 mode       tcp
 balance     roundrobin
 server  nginx nginx01:8443 ssl ca-file <The ca from nginx backend>

實施的解決方案是使用來自https://www.haproxy.com/documentation/haproxy/deployment-guides/tls-infrastructure/的 SS/TLS 直通 將前端和後端設置為模式 tcp 我能夠通過證書和nginx 驗證並進行身份驗證。

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