Nginx
通過 HAProxy 轉發 SSL 流量和身份驗證證書
我有一個來自客戶端的 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 驗證並進行身份驗證。