@foxikne

Как в haproxy сделать, чтобы подставлялся для каждого домена свой сертификат?

Здравствуйте. Подскажите, пожалуйста, наткнулся на проблему, нужно сделать чтобы когда запросы для определенного домена проходят через Haproxy брали сертификат, тот который указан в haproxy, для каждого домена свой. Вот как делаю:

frontend domain.com
  bind 0.0.0.0:443 ssl crt /etc/haproxy/certs/domain.com.pem
  http-request redirect scheme https if !{ ssl_fc }
  option http-server-close
  option httplog
  option forwardfor
  reqadd X-Forwarded-Proto:\ https
  reqadd X-Forwarded-Port:\ 443
 
  # set HTTP Strict Transport Security (HTST) header
  rspadd  Strict-Transport-Security:\ max-age=15768000
 
   acl host_domain.com hdr(host) -i domain.com
   use_backend domain.com if host_domain.com
  
backend domain.com
  balance leastconn
  option http-keep-alive
  option forwardfor
  cookie SERVERID insert indirect nocache
  timeout connect  30000
  timeout server 30000
  
  server server1 1.1.1.1:443 cookie 1 ssl verify none
  server server2 2.2.2.2:443 cookie 2 ssl verify none
  server server3 3.3.3.3:443 cookie 4 ssl verify none


так то оно работает нормально, но когда добавляю много сайтов, в особенности типа с поддоменами языковыми:
de.domain.com, nl.domain.com и т.д., оно начинает выдавать неправильные сертификаты, от других доменов. Иногда выдает правильно иногда нет. Когда мало доменов, то все нормально, когда много, постоянно разные сертификаты подставляет. Что неправильно делаю? Как это пофиксить? Честно говорят, даже не знаю, как в гугле задать правильно эту проблему.

P.S. у меня на серверах, куда ходят сайты просто самоподписанный сертификат, а я хочу чтобы именно на хапрокси были валидные, которые будут показываться пользователям.

Заранее благодарен за помощь.
  • Вопрос задан
  • 1350 просмотров
Решения вопроса 1
@yellowmew
Cloud infrastructure, monitoring engineer. SRE
frontend domain.com
bind 0.0.0.0:443 ssl crt /etc/haproxy/certs/domain.com.pem

На 443 порту у вас все эти сайты терминейтятся, а сертификат вы указываете один.
конкретно в вашем случае необходимо директиву crt указывать несколько раз:
bind 0.0.0.0:443 ssl crt /etc/haproxy/certs/domain.com.pem crt  /etc/haproxy/certs/en.domain.com.pem crt  /etc/haproxy/certs/ru.domain.com.pem crt ...

Или же - проще - указать директорию где лежат правильно приготовленные сертификаты и загрузить их все одно опцией crt /etc/haproxy/certs/
HAProxy в алфавитном порядке будет подставлять сертификаты. Соответственно если у вас в папке лежит устаревший сертификат для en.domain.com и новый для wildcard.domain.com - загружаться будет en... пока вы его не удалите и не перезагрузите HAProxy. Сертификаты из папки подгружаются при старте HAProxy и при замене сертификатов надо перезагружать софт (особенно актуально, если вы используете загрузку из папки)
К сожалению, вы не указали версию HAProxy и OpenSSL либы с которой собрана хапрокси.
В зависимости от версии хапры, опенссл и наличия\отсутствия openssl либы оно может работать по разному.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы