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


18

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

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

現在、これは標準のhttp接続には最適ですが、証明書をミックスに追加する方法を見つけようとしています。

この質問はほとんど同じであるこの1が、厄介な証明書の要件を持ちます。

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

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

回答:


19

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
    }

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


1
proxy_ssl_server_name on;組み込みのGoogle管理SSLを使用してGoogle App Engine上のホストにトラフィックをプロキシするときに、これを機能させるために必要なすべてでした!(これは自己署名証明書などではないため、その1行だけが必要です)。素晴らしいヒントをありがとう。
XP84

ssl_certificateを使用しないと、「listen ... ssl」ディレクティブに「ssl_certificate」が定義されていません。アップストリーム証明書を提供せずにSSLをプロキシすることは可能ですか?
ダミアン

これは、アップストリームhttpsへのhttp接続のプロキシに関するものであるため、コメントはトピック外です。httpsをプロキシする場合は、おそらく別の質問として対処することをお勧めします。簡単な答えは、No Nginxは証明書と秘密鍵なしでhttpsポートを「リッスン」できません。
shonky linuxユーザー

5

おそらく次のようなものが必要だと思います(この例では明らかに単純化されています):

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プロキシサーバーで使用されているホスト名と同じではない場合です。


私の理解では、ssl_certificateおよびssl_certificate_keyパラメーターは、アップストリーム接続ではなくクライアント接続を参照しています。そうですか?
シモンマドックス

1
私が理解していることから、はい。この例では、クライアントが見る証明書はnginxによって提供されたものです。nginxは、サーバーによって提供されたものを認識します(確認しますか?わかりません...)が、クライアントにパススルーしません。
ジャム

3

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.