nginx sebagai proxy terbalik dengan SSL hulu


18

Saya sedang membangun proxy untuk API internal untuk memungkinkan klien terhubung tanpa harus memiliki sertifikat yang ditandatangani sendiri.

Klien (dibangun, dimiliki, dan hanya digunakan secara internal) akan terhubung melalui SSL ke kotak nginx, tempat saya menggunakan XSendfile untuk memvalidasi kredensial di tingkat aplikasi (aplikasi rel). Jika kredensial valid, koneksi dilewatkan kembali ke nginx di mana ia menggunakan proxy_pass untuk mengirim koneksi ke server upstream.

Sekarang ini berfungsi baik untuk koneksi http standar, tapi saya mencoba mencari cara untuk menambahkan sertifikat kami ke dalam campuran.

Pertanyaan ini hampir identik dengan yang ini , tetapi dengan persyaratan sertifikat yang canggung.

Apakah ini mungkin dengan nginx? Apakah ada solusi yang lebih baik?

Saya juga menerima http dari klien -> nginx, dan sertifikat yang ditandatangani sendiri dari nginx ke API.

Jawaban:


19

Bagi siapa saja yang tersandung pada pertanyaan ini yang ingin menggunakan nginx, Anda dapat mengatur ini seperti proksi normal, dan untuk menerima sertifikat yang ditandatangani sendiri dari backend, Anda perlu memberikan sertifikat pem yang diekspor (dan mungkin kunci) dan mengatur verifikasi ssl mati. Sebagai contoh:

...

server {
    listen       10.1.2.3:80;
    server_name  10.1.2.3 myproxy.mycompany.com;

    location / {
         proxy_pass                    https://backend.server.ip/;
         proxy_ssl_trusted_certificate /etc/nginx/sslcerts/backend.server.pem;
         proxy_ssl_verify              off;

         ... other proxy settings
    }

Jika ujung belakang Anda aman menggunakan Identifikasi Nama Server SNI dengan beberapa host dilayani per IP / pasangan Port Anda mungkin juga perlu memasukkan proxy_ssl_server_name on;dalam konfigurasi. Ini bekerja pada nginx 1.7.0 dan yang lebih baru.


1
proxy_ssl_server_name on;hanya itu yang saya perlukan agar ini berfungsi saat proksi lalu lintas ke host di Google App Engine menggunakan SSL yang dikelola Google bawaannya! (Ini bukan sertifikat yang ditandatangani sendiri atau apa pun, jadi hanya perlu satu baris itu). Terima kasih atas tipnya.
XP84

Saya mendapatkan 'no "ssl_certificate" didefinisikan untuk arahan "listen ... ssl" jika saya tidak menggunakan ssl_certificate. Apakah mungkin untuk mem-proxy SSL tanpa memberikan sertifikat hulu?
Damien

Komentar di luar topik karena ini tentang proksi http yang menghubungkan ke https hulu. Jika Anda ingin proksi https maka mungkin lebih baik ditangani sebagai pertanyaan terpisah. Jawaban cepat dan singkat adalah Tidak Nginx tidak dapat "mendengarkan" ke port https tanpa sertifikat dan kunci pribadi.
pengguna linux shonky

5

Saya pikir Anda mungkin menginginkan sesuatu seperti ini (jelas disederhanakan untuk contoh ini):

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    upstream backend {
        server mybackendserver:443;
    }

    server {
        server_name localhost;
        listen 443 ssl;
        ssl_certificate /etc/nginx/server.crt;
        ssl_certificate_key /etc/nginx/server.key;
        ssl_verify_client off;
        location / {
            proxy_pass  https://backend;
            proxy_set_header Host $http_host;
            proxy_set_header X_FORWARDED_PROTO https;
        }
    }
}

Satu-satunya hal yang mungkin harus Anda ubah adalah membuat "Host" menjadi eksplisit - jika, misalnya, nama host yang Anda proksi tidak sama dengan nama host yang digunakan pada server proxy nginx.


Dari pemahaman saya, parameter ssl_certificate dan ssl_certificate_key merujuk pada koneksi klien , bukan koneksi hulu. Apakah itu masalahnya?
simonmaddox

1
Dari apa yang saya mengerti, ya. Dalam contoh ini, sertifikat yang dilihat klien adalah yang disediakan oleh nginx. nginx melihat (dan memverifikasi? Saya tidak yakin ...) yang disediakan oleh server, tetapi tidak meneruskannya ke klien.
Jam

3

Bagi siapa pun yang menemukan ini di masa depan, saya akhirnya tidak menggunakan nginx untuk ini.

Sebaliknya, saya akhirnya menggunakan stunnel di "mode klien". Sangat mudah diatur, dan melakukan apa yang saya butuhkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.