Пересылка SSL-трафика и сертификатов аутентификации через HAProxy

Пересылка SSL-трафика и сертификатов аутентификации через HAProxy

У меня есть 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, а также выполнить аутентификацию.

Связанный контент