Latar belakang singkat: Jika kita kembali ke masa sekitar tahun 2006-ish: Kami (yaitu: perusahaan saya) menggunakan aplikasi klien java tertanam di browser yang terhubung melalui port 443 ke backend program C yang berjalan di port 8068 pada server internal. Pada saat aplikasi java pertama kali dikembangkan, port 443 adalah satu-satunya port yang kami tahu tidak akan diblokir oleh pelanggan kami yang menggunakan perangkat lunak (kemudahan instalasi dan mungkin staf internal pelanggan tidak memiliki daya atau pengetahuan untuk mengontrol firewall internal mereka).

Maju cepat ke 2016, dan saya dipekerjakan untuk membantu mengembangkan versi NodeJS/Javascript dari aplikasi Java itu. Aplikasi Java terus digunakan selama pengembangan penggantinya, tetapi ups - kami mengetahui bahwa browser akan menghentikan dukungan untuk Java yang disematkan dalam waktu dekat. Jadi kami beralih ke Java Web Start, sehingga pelanggan dapat terus mengunduh aplikasi dan tetap terhubung ke server internal dengan perutean port 443->8068.

2017 bergulir dan tahukah Anda, kami tidak dapat menggunakan aplikasi web JS yang akan datang dengan HTTPS/SSL dan aplikasi Java secara bersamaan, karena mereka menggunakan port yang sama. "Oke mari kita gunakan NGINX untuk menyelesaikan masalah." Namun karena politik internal, kebutuhan pelanggan, dan pergantian staf pengembang web, kami tidak pernah benar-benar mewujudkannya.

Jadi di sinilah kita di tahun 2020, siap untuk menerapkan versi web baru dari perangkat lunak klien, dan seluruh 443 kekacauan muncul lagi.

Pada dasarnya saya ingin mengizinkan (untuk saat ini) aplikasi Java untuk terus menggunakan 443, tetapi sekarang perlu membiarkan aplikasi web menggunakan HTTPS juga. Kembali pada 2017/2018 kami mencari cara di Google untuk membiarkan mereka hidup bersama melalui NGINX, tetapi kami tidak pernah benar-benar membuatnya berfungsi dengan baik, atau contoh dan tutorialnya tidak lengkap atau membingungkan. Sepertinya kami perlu menggunakan streaming di sepanjang baris https://www.nginx.com/blog/running-non-ssl-protocols-over-ssl-port-nginx-1-15-2/, atau lihat header HTTPS yang masuk dan lakukan 'if (https) { route to nodeJS server } else { assume it must be the java app and route to port 8068 }' -semacam pengaturan di dalam file konfigurasi NGINX.

Tautan Googled sebelumnya tampaknya sudah tidak ada lagi, jadi jika ada yang mengetahui konfigurasi NGINX yang memungkinkan situs web HTTPS dialihkan ke aplikasi non-SSL yang masih perlu menggunakan 443, saya akan sangat menghargainya. Dan semua dokumen dan/atau tutorial yang mengarahkan kami ke arah yang benar juga akan sangat membantu. Terima kasih sebelumnya!

1
the digitalmouse 2 Maret 2020, 18:37

1 menjawab

Jawaban Terbaik

Anda dapat melakukannya menggunakan opsi ssl_preread. Pada dasarnya, opsi ini akan mengizinkan akses ke variabel $ssl_preread_protocol, yang berisi protokol yang dinegosiasikan di port SSL. Jika tidak ada protokol valid yang terdeteksi, variabel akan kosong.

Dengan menggunakan parameter ini, Anda dapat menggunakan konfigurasi berikut untuk lingkungan Anda:

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;
    }
}

Dalam kasus Anda, konfigurasi ini akan meneruskan koneksi langsung ke nodejs dan server backend java Anda, jadi, nodejs perlu menegosiasikan SSL. Anda dapat meneruskan pekerjaan ini ke NGiNX menggunakan konteks server lain, seperti:

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;
    }
}

http {
    server {
        listen 444 ssl;
        __your_ssl_cert_configurations_here__

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

Anda memerlukan NGiNX setidaknya versi 1.15.2 agar konfigurasi ini berfungsi, dan dikompilasi dengan modul ngx_stream_ssl_preread_module (perlu dikompilasi dengan parameter konfigurasi --with-stream_ssl_preread_module, karena modul ini tidak dibuat secara default).

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

4
Ernani Azevedo 6 Maret 2020, 15:08