
私のクライアントには nginx があり、次のようにして POST を正常に実行できます。
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' [email protected]
今、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' [email protected]
エラー:
<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
SSL トラフィックを HAProxy 経由で転送し、認証用の証明書を nginx に渡したいと考えています。2 つの LB を持つことに意味がないことはわかっていますが、nginx とその背後にある API サーバーを変更することはできませんが、クライアントは内部になります。ご覧のとおり、この時点では nginx にアクセスできますが、haproxy はリクエストからの証明書とキーを nginx バックエンドに渡しません。何か見落としているのでしょうか? これは私が達成できるものなのでしょうか?
ps: バックエンドで「ssl verify none」を設定している場合、「必要な SSL 証明書が送信されませんでした」というメッセージが表示されます。バックエンドで「send-proxy」を設定している場合、nginx から「400 Bad Request」というメッセージが表示されます。
答え1
haproxy に SSL 設定を追加し、nginx に転送されるいくつかのヘッダーを設定する必要があります。
# your other config from above
backend app
mode tcp
balance roundrobin
server nginx nginx01:8443 ssl ca-file <The ca from nginx backend>
答え2
実装されたソリューションは、SS/TLSパススルーでした。https://www.haproxy.com/documentation/haproxy/deployment-guides/tls-infrastructure/ フロントエンドとバックエンドの両方を tcp モードに設定すると、証明書を渡すことができ、nginx で検証して認証を行うことができました。