Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP模式下基于客户端CN的HAProxy-ACL_Tcp_Haproxy_Tls1.2 - Fatal编程技术网

TCP模式下基于客户端CN的HAProxy-ACL

TCP模式下基于客户端CN的HAProxy-ACL,tcp,haproxy,tls1.2,Tcp,Haproxy,Tls1.2,我正在TCP模式下使用TLS(基于客户端证书的身份验证)运行HAProxy。我的配置粘贴在下面。我的目标是根据提供的客户端证书将SSH连接重定向到正确的服务器。本例讨论SSH,但将来我可能需要以这种方式安全地公开各种服务。感谢您的帮助 注意,在HTTPS模式下,您可以使用类似的方法提取客户端CN,并针对ACL使用头中的变量。然而,由于我处于TCP模式,我不确定如何做类似的事情 http请求集头X-SSL-Client-CN%{+Q}[SSL_c_s_dn(CN)] 但是,我不确定在TCP模式下运

我正在TCP模式下使用TLS(基于客户端证书的身份验证)运行HAProxy。我的配置粘贴在下面。我的目标是根据提供的客户端证书将SSH连接重定向到正确的服务器。本例讨论SSH,但将来我可能需要以这种方式安全地公开各种服务。感谢您的帮助

注意,在HTTPS模式下,您可以使用类似的方法提取客户端CN,并针对ACL使用头中的变量。然而,由于我处于TCP模式,我不确定如何做类似的事情

http请求集头X-SSL-Client-CN%{+Q}[SSL_c_s_dn(CN)]

但是,我不确定在TCP模式下运行时如何执行类似操作

  frontend Frontend_server
  mode tcp
  option tcplog
  log global
  bind X.X.X.X:8000 ssl crt /etc/certs/server.pem ca-file /etc/certs/ca.crt verify required
  acl ACL_SRV1 ??????? -m str -f /etc/SRV1/cn.list
  acl ACL_SRV2 ??????? -m str -f /etc/SRV2/cn.list  
  acl ACL_SRV3 ??????? -m str -f /etc/SRV3/cn.list
  log-format %ci:%cp\ [%t]\ %ft\ %b/%s\ %ST\ %B\ %tsc\ %ac/%fc/%bc/%sc\ %sq/%bq\ {%[ssl_c_verify],%{+Q}[ssl_c_s_dn],%{+Q}[ssl_c_i_dn]

  use_backend SRV1 if ACL_SRV1
  use_backend SRV2 if ACL_SRV2
  use_backend SRV3 if ACL_SRV3

backend SRV1
  mode tcp
  option tcplog
  option tcp-check
  server MY_SRV1 X.X.X.X:22 check  inter 1000 port 22 maxconn 1000
backend SRV2
  mode tcp
  option tcplog
  option tcp-check
  server MY_SRV2 X.X.X.X:22 check  inter 1000 port 22 maxconn 1000
backend SRV3
  mode tcp
  option tcplog
  option tcp-check
  server MY_SRV3 X.X.X.X:22 check  inter 1000 port 22 maxconn 1000

在tcp模式下,TLS不会在HAProxy终止,而是在HAProxy后面的服务器上终止。当然,在向服务器发送或转发任何数据之前,必须知道该服务器。这意味着只能对TLS握手(ClientHello)中来自客户端的第一个数据做出选择哪个服务器的决定,而不能对以后需要服务器回复的数据做出选择

但是,只有当服务器明确请求客户端证书时,客户端才会发送这些证书。这意味着,为了从客户端获得客户端证书,服务器需要与客户端通信,这意味着必须已经建立到服务器的连接。当然,这意味着不能根据客户机证书来决定使用哪台服务器,因为在TLS握手中,客户机证书知道得太晚了


根据客户端证书做出此类决定的唯一方法是在负载平衡器处终止TLS。

使用tcp模式时,TLS不会在HAProxy处终止,而是在HAProxy后面的服务器上终止TLS。当然,在向服务器发送或转发任何数据之前,必须知道该服务器。这意味着只能对TLS握手(ClientHello)中来自客户端的第一个数据做出选择哪个服务器的决定,而不能对以后需要服务器回复的数据做出选择

但是,只有当服务器明确请求客户端证书时,客户端才会发送这些证书。这意味着,为了从客户端获得客户端证书,服务器需要与客户端通信,这意味着必须已经建立到服务器的连接。当然,这意味着不能根据客户机证书来决定使用哪台服务器,因为在TLS握手中,客户机证书知道得太晚了


根据客户端证书做出此类决定的唯一方法是在负载平衡器处终止TLS。

在HAProxy论坛上提出了这个问题并得到了答案。有关详细信息,请参阅在HAProxy论坛上提问并获得答案。有关详细信息,请参阅