haproxy配置sni实现https多域名代理

需求
haproxy需要同时实现内网机器通过http和https代理访问互联网,但是https代理我们没有证书,而且内网多个服务都需要通过代理访问不同的域名的https服务。
SSL初期的设计顺应经典的公钥基础设施 PKI(Public Key Infrastructure)设计,PKI 认为一个服务器只为一个域名提供服务,从而一个服务器上也就只能使用一个证书。
随着HTTP 服务器开启虚拟主机支持后,每个服务器通过相同的IP地址可以为很多域名提供服务。这种为虚拟主机提供通信安全的简单途径,却经常导致使用了错误的数字证书,因为服务器端无法知道客户端到底请求的是哪个域名下的服务,从而导致浏览器对用户发出警告。

引入sni
SNI (Server Name Indication)是用来改善服务器与客户端 SSL (Secure Socket Layer)和 TLS (Transport Layer Security) 的一个扩展。主要解决一台服务器只能使用一个证书(一个域名)的缺点,随着服务器对虚拟主机的支持,一个服务器上可以为多个域名提供服务,因此SNI必须得到支持才能满足需求。

haproxy sni

haproxy sni

SNI的TLS扩展通过发送虚拟域的名字做为TSL协商的一部分修正了这个问题,在Client Hello阶段,通过extensions扩展引入sni,将域名信息提前告诉服务器,服务器根据域名取得对应的证书返回给客户端已完成校验过程。

注意:sni的引入是在tcp传输层。

haproxy配置sni
# Global settings
global
log 127.0.0.1 local3
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

# turn on stats unix socket
stats socket /var/lib/haproxy/stats

defaults
log global
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
#tcp proxy https
frontend https_proxy
mode tcp
bind :443

tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }

acl is_api.mch.weixin.qq.com req_ssl_sni -i api.mch.weixin.qq.com
acl is_openapi.alipay.com req_ssl_sni -i openapi.alipay.com
acl is_openapi.alipaydev.com req_ssl_sni -i openapi.alipaydev.com
acl is_eco.taobao.com req_ssl_sni -i eco.taobao.com
acl is_graph.qq.com req_ssl_sni -i graph.qq.com
acl is_api.weibo.com req_ssl_sni -i api.weibo.com
acl is_api.weixin.qq.com req_ssl_sni -i api.weixin.qq.com
acl is_mapi.alipay.com req_ssl_sni -i mapi.alipay.com
acl is_api.jpush.cn req_ssl_sni -i api.jpush.cn

use_backend api.mch.weixin.qq.com if is_api.mch.weixin.qq.com
use_backend openapi.alipay.com if is_openapi.alipay.com
use_backend openapi.alipaydev.com if is_openapi.alipaydev.com
use_backend eco.taobao.com if is_eco.taobao.com
use_backend graph.qq.com if is_graph.qq.com
use_backend api.weibo.com if is_api.weibo.com
use_backend api.weixin.qq.com if is_api.weixin.qq.com
use_backend mapi.alipay.com if is_mapi.alipay.com
use_backend api.jpush.cn if is_api.jpush.cn

backend api.mch.weixin.qq.com
server web1 api.mch.weixin.qq.com:443

backend openapi.alipay.com
server web1 openapi.alipay.com:443

backend openapi.alipaydev.com
server web1 openapi.alipaydev.com:443

backend eco.taobao.com
server web1 eco.taobao.com:443

backend graph.qq.com
server web1 graph.qq.com:443

backend api.weibo.com
server web1 api.weibo.com:443

backend api.weixin.qq.com
server web1 api.weixin.qq.com:443

backend mapi.alipay.com
server web1 mapi.alipay.com:443

backend api.jpush.cn
server web1 api.jpush.cn:443
#http proxy
frontend http_proxy
mode http
bind :80
acl is_api.map.baidu.com hdr_beg(host) -i api.map.baidu.com
acl is_wappaygw.alipay.com hdr_beg(host) -i wappaygw.alipay.com
acl is_gw.api.taobao.com hdr_beg(host) -i gw.api.taobao.com

use_backend api.map.baidu.com if is_api.map.baidu.com
use_backend wappaygw.alipay.com if is_wappaygw.alipay.com
use_backend gw.api.taobao.com if is_gw.api.taobao.com

backend api.map.baidu.com
mode http
server web1 api.map.baidu.com

backend wappaygw.alipay.com
mode http
server web1 wappaygw.alipay.com

backend gw.api.taobao.com
mode http
server web1 gw.api.taobao.com

从上面的tcp代理处,我们可以看到通过sni区分不同的域名从而选择后端的服务器。
另在http代理处,我们可以看到也使用host区分域名实现不同的后端转发。

haproxy配置sni实现https多域名代理:等您坐沙发呢!

发表评论

表情
还能输入210个字