自己署名証明書をインストールしなくてもクライアントが接続できるように、内部APIのプロキシを構築しています。
クライアント(内部でのみ構築、所有、使用)は、SSL経由でnginxボックスに接続します。ここでは、アプリケーションレベルで資格情報を検証するために XSendfile を使用しています(a Rails = app)資格情報が有効な場合、接続はnginxに戻され、proxy_passを使用して接続をアップストリームサーバーに送信します。
これは標準のhttp接続に適していますが、証明書をミックスに追加する方法を理解しようとしています。
この質問は これ とほぼ同じですが、証明書の要件が厄介です。
これはnginxでも可能ですか?より良い解決策はありますか?
クライアントからのhttp-> nginx、およびnginxからAPIへの自己署名証明書も解決します。
将来これに遭遇した人のために、私はこれにnginxを使用しなくなりました。
代わりに、「クライアントモード」でstunnelを使用することになりました。設定は非常に簡単で、私が必要としていることを正確に実行します。
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以降で動作します。
私はあなたがおそらくこのようなものを望んでいると思います(この例では明らかに簡略化されています):
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プロキシサーバーで使用されているホスト名と異なる場合などです。