反向代理可以将 SNI 与 SSL 传递一起使用吗?

use*_*862 24 https reverse-proxy sni

我需要使用一个外部 IP 地址通过 https 为多个应用程序提供服务。

不应在反向代理上管理 ssl 证书。它们安装在应用程序服务器上。

是否可以将反向代理配置为使用 SNI 并通过 ssl 在端点处终止?

这可以使用 Nginx 或 Apache 之类的东西吗?配置是什么样的?

Flo*_*aie 16

这可以通过 Haproxy 实现。您可以设置 TCP 代理并提取 SNI 并根据 SNI 进行路由。下面是一个例子:

backend be.app1
    mode tcp
    no option checkcache
    no option httpclose
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }
    tcp-request content reject
    use-server server1 if { req.ssl_sni -m beg app1. }
    server server1 server1:8443 check id 1 weight 0
Run Code Online (Sandbox Code Playgroud)

必须延迟请求直到您收到 SSL hello,否则 haproxy 将在收到 SNI 标头之前尝试建立连接。

我使用权重为 0 的服务器,因为在我当前的配置中,我只为每个 SNI 运行一台服务器,我不希望它们接收随机请求。你可能会找到更好的方法来玩这个。

我希望这有帮助。

  • @user319862 我发现 [这个不错的教程](http://blog.haproxy.com/2012/04/13/enhanced-ssl-load-balancing-with-server-name-indication-sni-tls-extension/)似乎正在讨论什么。 (3认同)

mic*_*ick 8

您可以使用 sniproxy:https : //github.com/dlundquist/sniproxy

一个示例配置:

listener 0.0.0.0:443 {
    protocol tls
    table TableHTTPS
    fallback 127.0.0.1:8443
}

listener 0.0.0.0:80 {
    protocol http
    table TableHTTP
    fallback 127.0.0.1:8080
}

table TableHTTPS {
    domain1.com backend1:443
    domain2.org backend2:443
}

table TableHTTP {
    domain1.com backend1:80
    domain2.org backend2:80
}
Run Code Online (Sandbox Code Playgroud)


vog*_*vog 7

这当然是可能的,即使是在 2021 年,随着 TLS 1.3 越来越普遍!许多 Web 服务器或专门的反向代理提供了这种开箱即用的功能:

  • nginx ? 1.11.5(Debian ? buster 或延伸向后移植)
  • 代理服务器?1.5(Debian?杰西)
  • Sniproxy (Debian ? buster)
  • 等等。

这是 Nginx 的示例配置,对于需要反向代理的设置来说,这是一个非常受欢迎的选择:

stream {
  map $ssl_preread_server_name $selected_upstream {
    example.org upstream_1;
    example.net upstream_2;
    example.com upstream_3;
    default upstream_4;
  }
  upstream upstream_1 { server 10.0.0.1:443; }
  upstream upstream_2 { server 10.0.0.2:443; }
  upstream upstream_3 { server 10.0.0.3:443; }
  upstream upstream_4 { server 10.0.0.4:443; }
  server {
    listen 10.0.0.5:443;
    proxy_pass $selected_upstream;
    ssl_preread on;
  }
}
Run Code Online (Sandbox Code Playgroud)

相关的 Nginx 模块是stream_corestream_ssl_preread。手册: