Nginx als Reverse-Proxy mit Upstream-SSL

18

Ich erstelle einen Proxy für eine interne API, damit Clients eine Verbindung herstellen können, ohne dass die selbstsignierten Zertifikate installiert sein müssen.

Clients (nur intern erstellt, im Besitz und verwendet) stellen über SSL eine Verbindung mit der Nginx-Box her, in der ich XSendfile verwende , um Anmeldeinformationen auf Anwendungsebene zu validieren (eine Rails-App). Wenn die Anmeldeinformationen gültig sind, wird die Verbindung an nginx zurückgegeben, wo sie mithilfe von proxy_pass die Verbindung an den Upstream-Server sendet.

Das funktioniert jetzt hervorragend für Standard-HTTP-Verbindungen, aber ich versuche herauszufinden, wie wir unsere Zertifikate in den Mix aufnehmen können.

Diese Frage ist fast identisch mit dieser , aber mit umständlichen Zertifikatanforderungen.

Ist das überhaupt mit Nginx möglich? Gibt es eine bessere Lösung?

Ich würde mich auch mit http von client -> nginx und selbstsigniertem Zertifikat von nginx an die API begnügen.

simonmaddox
quelle

Antworten:

19

Wenn Sie über diese Frage stolpern und nginx verwenden möchten, können Sie dies wie einen normalen Proxy einrichten. Wenn Sie ein selbstsigniertes Zertifikat vom Backend akzeptieren möchten, müssen Sie das exportierte PEM-Zertifikat (und möglicherweise einen Schlüssel) bereitstellen und die SSL-Überprüfung festlegen aus. Beispielsweise:

...

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
    }

Wenn Ihr sicheres Back-End die SNI zur Identifizierung des Servernamens verwendet und mehrere Hosts pro IP / Port-Paar bedient werden, müssen Sie diese möglicherweise auch proxy_ssl_server_name on;in die Konfiguration einbeziehen. Dies funktioniert mit Nginx 1.7.0 und höher.

Shonky Linux Benutzer
quelle
1
proxy_ssl_server_name on;Das war alles, was ich brauchte, um dieses Problem zu lösen, wenn ich Datenverkehr über das integrierte, von Google verwaltete SSL an einen Host in Google App Engine weiterleitete! (Dies ist kein selbstsigniertes Zertifikat oder ähnliches, daher wird nur diese eine Zeile benötigt). Danke für den tollen Tipp.
XP84
Ich erhalte "kein" ssl_certificate "ist für die" listen ... ssl "-Direktive definiert, wenn ich ssl_certificate nicht verwende. Ist es möglich, SSL ohne Bereitstellung des Upstream-Zertifikats per Proxy zu übertragen?
Damien
Kommentar ist kein Thema, da es um das Proxy von http geht, das eine Verbindung zu vorgelagertem https herstellt. Wenn Sie https als Proxy verwenden möchten, wird dies wahrscheinlich besser als separate Frage behandelt. Die schnelle und kurze Antwort lautet: Nein. Nginx kann einen https-Port ohne Zertifikat und privaten Schlüssel nicht "abhören".
Shonky Linux Benutzer
5

Ich denke, Sie möchten wahrscheinlich so etwas (offensichtlich vereinfacht für dieses Beispiel):

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

Das einzige, was Sie möglicherweise ändern müssen, ist, den "Host" explizit anzugeben - wenn beispielsweise Ihr Proxy-Hostname nicht mit dem Hostnamen übereinstimmt, der auf dem Nginx-Proxyserver verwendet wird.

Marmelade
quelle
Nach meinem Verständnis beziehen sich die Parameter ssl_certificate und ssl_certificate_key auf die Client- Verbindung und nicht auf die Upstream-Verbindung. Ist das der Fall?
Simonmaddox
1
Soweit ich weiß, ja. In diesem Beispiel wird dem Client das von nginx bereitgestellte Zertifikat angezeigt. nginx erkennt (und überprüft? Ich bin nicht sicher ...) die vom Server bereitgestellte, leitet sie jedoch nicht an den Client weiter.
Jam
3

Für alle, die dies in Zukunft bemerken, habe ich Nginx letztendlich nicht verwendet.

Stattdessen habe ich stunnel im "Client-Modus" verwendet. Sehr einfach einzurichten und macht genau das, was ich brauche.

simonmaddox
quelle