У меня 4 сервера:
«proxy_server» имеет только Сервис с поддержкой HAProxy с этой конфигурацией: (см. строки, помеченные как ВАРИАНТ 1 И ВАРИАНТ 2)
# StackOverflow
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
timeout connect 10s
timeout client 30s
timeout server 30s
log global
mode http
option httplog
option dontlognull
# ***************** port 80 defs ************
frontend http_in
mode http
option httplog
bind *:80
option forwardfor
acl host_goose hdr(host) -i www.example.edu
redirect scheme https code 301 if !host_goose
use_backend http_goose if host_goose
backend http_goose
mode http
server sonar $BK_SERVER_003:8080
# ***************** port 443 defs ************
frontend https_in
mode tcp
option tcplog
# With this one, all works except sonar (OPTION 1)
# bind *:443
# With this one, only works sonar (OPTION 2)
bind *:443 ssl crt sonar.pem
acl tls req.ssl_hello_type 1
tcp-request inspect-delay 5s
tcp-request content accept if tls
acl host_server001 req.ssl_sni -i opengrok.ci.example.edu
acl host_server002 req.ssl_sni -i gitlab.ci.example.edu
acl host_server003 req.ssl_sni -i jenkins.ci.example.edu
acl host_server004 req.ssl_sni -i nexus.ci.example.edu
acl host_server005 req.ssl_sni -i rancher.ci.example.edu
acl host_server006 req.ssl_sni -i reports.ci.example.edu
acl host_server007 hdr(host) -i sonar.ci.example.edu
use_backend https_server001 if host_server001
use_backend https_server002 if host_server002
use_backend https_server003 if host_server003
use_backend https_server004 if host_server004
use_backend https_server005 if host_server005
use_backend https_server006 if host_server006
use_backend https_server007 if host_server007
#opengrok
backend https_server001
mode tcp
server server001 $BK_SERVER_001:28443
#gitlab
backend https_server002
mode tcp
server server002 $BK_SERVER_002:10443
#jenkins
backend https_server003
mode tcp
server server003 $BK_SERVER_001:7443
#nexus
backend https_server004
mode tcp
server server004 $BK_SERVER_001:8443
#rancher
backend https_server005
mode tcp
server server005 $BK_SERVER_002:9443
#reports
backend https_server006
mode tcp
server server006 $BK_SERVER_001:4443
#sonar
backend https_server007
mode http
server server007 $BK_SERVER_001:9000
Для ВАРИАНТА 2 HAProxy успешно публикует сервис «сонар» с использованием данного сертификата, однако остальные службы пытаются использовать этот сертификат. Поскольку для других сервисов уже включен SSL в соответствующих бэкэндах, у меня НЕТ их сертификатов.
Если я использую ВАРИАНТ 1, HAProxy успешно опубликует все уже-ssl-backend сервисы, кроме сервиса «сонар», потому что ему нужен сертификат, который у меня есть только на уровне proxy_server.
Возможно ли, чтобы все службы были защищены с помощью SSL, если (как я уже сказал) некоторые из них уже защищены, а некоторые другие будут защищены HAProxy с помощью только одного SSL что у меня есть доступ к услуге "сонар"? Как?
Также обратите внимание, что у меня нет доступа ssh к серверам $ BK_SERVER_xxx и что у меня все DNS указывают свои имена на «proxy_server».
Я не думаю, что вы сможете добиться того, что пытаетесь сделать: как вы видели, как только вы представляете сертификат, слушатель прекращает "слепое" проксирование зашифрованного трафика прямо к правильному бэкэнду и вместо этого пытается завершить все клиентские TLS-соединения, используя предоставленные сертификаты, безуспешно, если не может предоставить действительный сертификат для запрошенного домена.
Насколько я понимаю, у вас есть несколько простых альтернатив:
1. Настройте отдельный обратный прокси-сервер перед «сонаром» и любыми будущими службами, сертификат которых у вас действительно есть.
2. Купите групповой сертификат для * .ci.example.edu, чтобы использовать его во внешнем интерфейсе, и укажите сертификат CA, чтобы позволить HAProxy проверять сертификаты, представленные внутренними серверами.
Отредактировано для добавления: HAProxy с радостью позволяет вам определить несколько сертификатов приемника, чтобы вы могли легко прослушивать запросы для нескольких доменов с помощью единого внешнего интерфейса, если клиенты понимают, как выбирать среди представленных сертификатов - что и делает все современное и соответствующее стандартам программное обеспечение.