web-dev-qa-db-ja.com

アップストリームSSLを備えたリバースプロキシとしてのnginx

自己署名証明書をインストールしなくてもクライアントが接続できるように、内部APIのプロキシを構築しています。

クライアント(内部でのみ構築、所有、使用)は、SSL経由でnginxボックスに接続します。ここでは、アプリケーションレベルで資格情報を検証するために XSendfile を使用しています(a Rails = app)資格情報が有効な場合、接続はnginxに戻され、proxy_passを使用して接続をアップストリームサーバーに送信します。

これは標準のhttp接続に適していますが、証明書をミックスに追加する方法を理解しようとしています。

この質問は これ とほぼ同じですが、証明書の要件が厄介です。

これはnginxでも可能ですか?より良い解決策はありますか?

クライアントからのhttp-> nginx、およびnginxからAPIへの自己署名証明書も解決します。

20
simonmaddox

将来これに遭遇した人のために、私はこれにnginxを使用しなくなりました。

代わりに、「クライアントモード」でstunnelを使用することになりました。設定は非常に簡単で、私が必要としていることを正確に実行します。

3
simonmaddox

Nginxを使用したいこの質問に出くわした人は、通常のプロキシのようにこれをセットアップし、バックエンドから自己署名証明書を受け入れるには、エクスポートされたpem証明書(およびおそらくキー)を提供し、ssl検証を設定する必要がありますオフ。例えば:

...

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
    }

安全なバックエンドがサーバー名識別SNIを使用しており、IP /ポートのペアごとに複数のホストが提供されている場合は、構成にproxy_ssl_server_name on;を含める必要がある場合もあります。これはnginx 1.7.0以降で動作します。

21

私はあなたがおそらくこのようなものを望んでいると思います(この例では明らかに簡略化されています):

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

変更する必要があるのは、「ホスト」を明示的にすることだけです。たとえば、プロキシされたホスト名がnginxプロキシサーバーで使用されているホスト名と異なる場合などです。

6
Jam