
У меня есть 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]
Теперь я установил haproxy перед nginx и пытаюсь выполнить 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. Я знаю, что нет смысла иметь два LB, но я не могу изменить nginx и сервер API позади, но клиенты будут внутренними. Как вы видите, на данный момент я могу связаться с nginx, но haproxy не передает сертификаты и ключи из запроса в бэкенд nginx. Я что-то упускаю? Могу ли я этого добиться?
ps: Если я устанавливаю 'ssl verify none' на бэкенде, я получаю 'No required SSL certificate was passed'. Если я устанавливаю 'send-proxy' на бэкенде, я получаю '400 Bad Request' от nginx.
решение1
Вам нужно будет добавить конфигурацию 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>
решение2
решение было реализовано с использованием SS/TLS pass-through изhttps://www.haproxy.com/documentation/haproxy/deployment-guides/tls-infrastructure/ Установив как frontend, так и backend в режим tcp, мне удалось передать сертификаты и проверку nginx, а также выполнить аутентификацию.