nginx come proxy inverso con SSL upstream


18

Sto creando un proxy per un'API interna per consentire ai client di connettersi senza dover installare i certificati autofirmati.

I client (creati, posseduti e utilizzati solo internamente) si collegheranno tramite SSL alla casella nginx, dove sto usando XSendfile per convalidare le credenziali a livello di applicazione (un'app rails). Se le credenziali sono valide, la connessione viene ripristinata a nginx dove utilizza proxy_pass per inviare la connessione al server upstream.

Ora funziona alla grande per le connessioni http standard, ma sto cercando di capire come aggiungere i nostri certificati nel mix.

Questa domanda è quasi identica a questa , ma con requisiti di certificato scomodi.

È possibile anche con nginx? C'è una soluzione migliore?

Mi accontenterei anche di http dal client -> nginx e del certificato autofirmato da nginx all'API.

Risposte:


19

Per chiunque si imbatta in questa domanda che desidera utilizzare nginx è possibile configurarlo come un normale proxy e per accettare un certificato autofirmato dal backend è necessario fornire il certificato pem esportato (e forse una chiave) e impostare la verifica SSL off. Per esempio:

...

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
    }

Se il back-end sicuro utilizza SNI di identificazione nome server con più host serviti per coppia IP / porta, potrebbe essere necessario includere anche proxy_ssl_server_name on;nella configurazione. Funziona su nginx 1.7.0 e versioni successive.


1
proxy_ssl_server_name on;era tutto ciò di cui avevo bisogno per farlo funzionare quando inoltravo il traffico a un host su Google App Engine usando il suo SSL integrato gestito da Google! (Questo non è un certificato autofirmato o altro, quindi aveva solo bisogno di quella riga). Grazie per l'ottimo consiglio.
XP84,

Ottengo "nessun" ssl_certificate "è definito per la direttiva" ascolta ... ssl "se non uso ssl_certificate. È possibile eseguire il proxy SSL senza fornire il certificato upstream?
Damien,

Il commento è fuori tema in quanto si tratta di inviare proxy http a https upstream. Se si desidera eseguire il proxy https, probabilmente è meglio affrontarlo come una domanda separata. La risposta rapida e breve è No Nginx non può "ascoltare" una porta https senza certificato e chiave privata.
utente Linux shonky

5

Penso che probabilmente vuoi qualcosa del genere (ovviamente semplificato per questo esempio):

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

L'unica cosa che potresti dover cambiare sarebbe rendere esplicito "Host" - se, ad esempio, il tuo nome host proxy non era lo stesso del nome host utilizzato sul server proxy nginx.


Da quanto ho capito, i parametri ssl_certificate e ssl_certificate_key si riferiscono alla connessione client , non alla connessione upstream. È così?
simonmaddox,

1
Da quello che ho capito, sì. In questo esempio, il certificato visualizzato dal client è quello fornito da nginx. nginx vede (e verifica? Non sono sicuro ...) quello fornito dal server, ma non lo passa al client.
Jam

3

Per chiunque si imbatte in questo in futuro, ho finito per non usare nginx per questo.

Invece, ho finito per usare lo stunnel in "modalità client". Molto facile da configurare e fa esattamente quello di cui ho bisogno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.