2013-12-10 6 views
3

Я пытаюсь разместить HTTPS-сервер позади HAProxy load balancer. Сервер HTTPS работает на Node.js на порту 8000, имеет все правильные сертификаты и ключи SSL и работает, если я попытаюсь получить доступ к нему напрямую через URL-адрес, например. https://ssltest.mydomain.com:8000/. Я также могу проверить соединение SSL, используя openssl s_client -connect ssltest.mydomain.com:8000, и он показывает данные, которые кажутся правильными.SSL over HAProxy issue

Передний конец для этого HTTPS-сервера является другим поддоменом, например. app.mydomain.com и он работает по порту SSL по умолчанию 443.

Но когда я пытаюсь получить доступ к https://app.mydomain.com из своего браузера, я получаю сообщение об ошибке SSL. Приведенная выше команда проверки линии также не: openssl s_client -connect app.mydomain.com:443 -state -debug

Ниже, как мой HA Proxy конфигурации выглядит следующим образом:

global 
    log /dev/log local0 info 
    log /dev/log local0 notice 
    maxconn 20000 
    user haproxy 
    group haproxy 
    daemon 
    spread-checks 5 

defaults 
    log  global 
    mode tcp 
    option dontlognull 
    retries 3 
    option redispatch 
    timeout connect 30s 
    timeout client 30s 
    timeout server 30s 
    timeout check 5s 
    balance roundrobin 

frontend https_proxy 
    bind :443 
    acl is_app hdr_dom(host) -i app.mydomain.com 
    acl is_rest hdr_dom(host) -i rest.mydomain.com 
    acl is_io hdr_dom(host) -i io.mydomain.com 
    use_backend core_https if is_app 
    use_backend core_rest_api if is_rest 
    use_backend core_www_io if is_io 

backend core_https 
    server www1 10.0.0.174:8000 maxconn 25 check inter 5s rise 18 fall 2 

backend core_www_io 
    server io1 10.0.0.174:8100 maxconn 25 check inter 5s rise 18 fall 2 

backend core_rest_api 
    server api1 10.0.0.174:8200 maxconn 25 check inter 5s rise 18 fall 2 

Я не могу понять, почему это не работает через HAProxy но работает напрямую, и я бы ДЕЙСТВИТЕЛЬНО оцените ваши предложения.

+0

Я мало знаю о haproxy, но мне кажется, что вы хотите получить доступ к 3 различным бэкендам, в зависимости от хоста, который клиент отправляет в своем хосте: http-заголовок. Это не работает с SSL, потому что HTTP-заголовки не отправляются на сервер до тех пор, пока не будут согласованы SSL, и согласование SSL уже должно знать о целевом имени хоста, чтобы выбрать правильный сертификат. –

+0

спасибо за ответ, но в этом случае не имеет значения, если это 1,3 или более разных хостов. Это не работает ни для одного из них, как я уже сказал, но работает при непосредственном подключении к хосту без HAProxy –

ответ

2

Вы смешиваете балансировку нагрузки уровня 4 и слоя 7. Чтобы отделить запросы с использованием hdr_dom, вам нужен уровень 7, доступный только для HTTP, и, как вы можете догадаться, HTTPS работает на уровне 4.

Так как haproxy не может проверить хост, ни одно из ваших ifs не возвращается true, и нет Бэкэнд выбран, чтобы исправить, вы должны добавить запись default_backend.

frontend https_proxy 
    bind :443 
    acl is_app hdr_dom(host) -i app.mydomain.com 
    acl is_rest hdr_dom(host) -i rest.mydomain.com 
    acl is_io hdr_dom(host) -i io.mydomain.com 
    use_backend core_https if is_app 
    use_backend core_rest_api if is_rest 
    use_backend core_www_io if is_io 
    default_backend core_https 
+0

Привет, спасибо, я попробовал его без acl, и он работает. По-моему, я должен различать порты, а не субдомены, или искать больше решений. –

+0

Вы можете использовать acl с проверками уровня 4, например, разными портами. Но я бы рекомендовал прекратить SSL до или после haproxy, вы можете сделать это с помощью haproxy 1.5, или вы можете установить, F.E., nginx перед haproxy. –