如何使SSL与非SSL协议数据完美兼容

问题描述 投票:0回答:1

简短的背景:如果我们回到2006年左右:我们(即:我的公司)使用了Java客户端应用程序嵌入在浏览器中,该应用程序通过端口443连接到在端口上运行的C程序后端内部服务器上的8068。在最初开发Java应用程序的时候,端口443是我们知道不会被使用该软件的客户阻止的唯一端口(易于安装,并且客户内部人员可能没有能力或控制其内部防火墙的知识)。

快进到2016年,我受雇帮助开发该Java应用程序的NodeJS / Javascript版本。 Java应用程序在其替代产品的开发过程中仍将继续使用,但是请放心-我们了解到,浏览器将在不久的将来放弃对嵌入式Java的支持。因此,我们切换到Java Web Start,以便客户可以继续下载该应用程序,并且该应用程序仍通过端口443-> 8068路由连接到内部服务器。

2017滚滚而来,您不知道,我们不能同时使用即将推出的JS Web应用程序和HTTPS / SSL以及Java应用程序,因为它们使用相同的端口。 “好吧,让我们使用NGINX来解决问题。”但是由于内部政治,客户需求以及Web开发人员的交接,我们永远无法真正实现这项工作。

所以我们到了2020年,已经准备好部署客户端软件的新的Web版本,整个443乱七八糟的举动再次令人头疼。

基本上,我希望暂时允许Java应用继续使用443,但现在也需要让Web应用也使用HTTPS。早在2017/2018年,我们就通过Google搜索了让它们通过NGINX同居的方法,但是我们从未真正让它们正常工作,或者示例和教程不完整或令人困惑。似乎我们需要按照https://www.nginx.com/blog/running-non-ssl-protocols-over-ssl-port-nginx-1-15-2/的方式使用流传输,或者查看传入的HTTPS标头并在NGINX配置文件中进行“ if (https) { route to nodeJS server } else { assume it must be the java app and route to port 8068 }”排序。

过去的Googled链接似乎不再存在,因此,如果有人知道允许HTTPS网站切换到仍需要使用443的非SSL应用程序的NGINX配置,我将不胜感激。任何指向我们正确方向的文档和/或教程也将有所帮助。预先感谢!

node.js ssl nginx https java-web-start
1个回答
0
投票

您可以使用ssl_preread选项执行此操作。基本上,此选项将允许访问变量$ ssl_preread_protocol,该变量包含在SSL端口协商的协议。如果未检测到有效协议,则变量将为空。

使用此参数,您可以在环境中使用以下配置:

stream {
    upstream java {
        server __your_java_server_ip__:8068;
    }

    upstream nodejs {
        server __your_node_js_server_ip__:443;
    }

    map $ssl_preread_protocol $upstream {
        default java;
        "TLSv1.2" nodejs;
    }

    server {
        listen 443;

        proxy_pass $upstream;
        ssl_preread on;
    }
}

在您的情况下,此配置会将连接直接传递给您的nodejs,而nodejs将需要协商SSL。您可以使用以下方法将这项工作传递给NGiNX:

stream {
    upstream java {
        server __your_java_server_ip__:8068;
    }

    upstream nodejs {
        server 127.0.0.1:444;
    }

    map $ssl_preread_protocol $upstream {
        default java;
        "TLSv1.2" nodejs;
    }

    server {
        listen 443;

        proxy_pass $upstream;
        ssl_preread on;
    }

    server {
        listen 444;
        __your_ssl_cert_configurations_here__

        location / {
            proxy_pass http://__your_nodejs_server_ip__:80;
        }
    }
}

来源:https://www.nginx.com/blog/running-non-ssl-protocols-over-ssl-port-nginx-1-15-2/

© www.soinside.com 2019 - 2024. All rights reserved.