it-swarm.com.de

Nginx als Reverse Proxy mit Upstream-SSL

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 (erstellt, im Besitz und nur intern verwendet) stellen über SSL eine Verbindung zur Nginx-Box her, in der ich XSendfile verwende, um Anmeldeinformationen auf Anwendungsebene zu überprüfen (a Rails) = app). Wenn die Anmeldeinformationen gültig sind, wird die Verbindung an nginx zurückgegeben, wo sie die Verbindung mit proxy_pass an den Upstream-Server sendet.

Dies funktioniert 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 diese , jedoch mit umständlichen Zertifikatanforderungen.

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

Ich würde mich auch mit http vom Client -> nginx und einem selbstsignierten Zertifikat von nginx an die API zufrieden geben.

20
simonmaddox

Für alle, die in Zukunft darauf stoßen, habe ich Nginx dafür nicht verwendet.

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

3
simonmaddox

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

...

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 Backend SNI zur Identifizierung von Servernamen verwendet und mehrere Hosts pro IP/Port-Paar bedient werden, müssen Sie möglicherweise auch proxy_ssl_server_name on; In die Konfiguration aufnehmen. Dies funktioniert unter Nginx 1.7.0 und höher.

21

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 zu machen - wenn beispielsweise Ihr Proxy-Hostname nicht mit dem auf dem nginx-Proxyserver verwendeten Hostnamen übereinstimmt.

6
Jam