我有 4 台服务器:
- 代理服务器,
- $BK_SERVER_001,
- $BK_SERVER_002 和
- $BK_SERVER_003
“proxy_server” 仅具有启用了 HAProxy 的服务,其配置如下:(请查看标记为 OPTION 1 和 OPTION 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 使用给定的证书成功发布了服务“sonar”,但是,其余服务正在尝试使用该证书。由于其他服务已在其相应的后端启用 SSL,因此我没有它们的证书。
如果我使用选项 1,HAProxy 将成功发布除“sonar”服务之外的所有已经具有 SSL 后端的服务,因为它需要我仅在 proxy_server 级别拥有的证书。
如果(如我所说)其中一些服务已经受到保护,但其他一些服务将由 HAProxy 保护,并且我只能使用 SSL 访问“sonar”服务,那么是否可以使用 SSL 保护所有服务?如何操作?
还请注意,我没有 $BK_SERVER_xxx 服务器的 ssh 访问权限,并且我已将所有 DNS 名称指向“proxy_server”。
答案1
我认为您无法实现您想要做的事情:正如您所看到的,一旦您出示证书,侦听器就会停止“盲目地”将加密流量直接代理到正确的后端,而是尝试使用提供的证书终止所有客户端 TLS 连接,如果它无法为请求的域提供有效的证书,则会失败。
在我看来,您有几个简单的选择:
1. 在“sonar”和您拥有证书的任何未来服务前面设置一个单独的反向代理。2
. 购买 *.ci.example.edu 的通配符证书以在前端使用,并指出 CA 证书以允许 HAProxy 验证后端服务器提供的证书。
编辑以添加:HAProxy 很乐意让您定义多个侦听器证书,因此您可以使用单个前端轻松侦听多个域的请求,只要客户端了解如何在所提供的证书中进行选择 - 所有现代且符合标准的软件都可以这样做。