基于SNI的Nginx代理无需解密

use*_*862 4 nginx

我目前正在使用以下(简化的)配置来代理同一端口上的 http 和 https 连接(aws elastic beanstalk 需要):

server {
    listen 777 ssl;
    server_name foo.com;
    ssl_certificate /etc/nginx/ssl/foo.crt;
    ssl_certificate_key /etc/nginx/ssl/foo;

    root /usr/share/nginx/www;
    index index.html index.htm;

    error_page 418 = @upstream;
    error_page 497 = @upstream;

    location / {
        return 418;
    }

    location @upstream {
        proxy_set_header  X-Forwarded-Proto  $scheme;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将上游更改为 uwsgi 并让 uwsgi 处理 ssl,因为它会简化部署。

如何在 Nginx 不解密 ssl 流量的情况下调整我的配置以适用于 SNI HTTPS 和 HTTP?

小智 5

看起来现在使用ngx_stream_ssl_preread_module模块支持


mas*_*oeh 2

,Nginx 做不到。默认情况下,Nginx 始终解密内容,因此 Nginx 可以应用请求路由。一些可以尝试的解决方案:

  • 有名为nginx_tcp_proxy_module的第 3 方模块。我还没试过。由于该模块在网络层进行代理,因此它会在不解密的情况下传递请求。

  • 首选解决方案是使用 HAProxy。本教程建议您可以使用 SNI 功能进行 TCP 代理。


边注

默认情况下,Nginx 始终充当代理上的 SSL 卸载/解密进程。这里有一些进行 SSL 卸载的优点(摘自此处

  • 提高性能
  • 更好地利用后端服务器
  • 智能路由
  • 证书管理
  • 安全补丁