NGINX のデフォルトの仮想ホストに複数の SSL 証明書を提供するにはどうすればよいでしょうか?

NGINX のデフォルトの仮想ホストに複数の SSL 証明書を提供するにはどうすればよいでしょうか?

私は、NGINX プロキシ経由で提供される静的アプリを Amazon S3 上に持っています。プロキシを使用する目的は、ユーザーが自分のドメインを Amazon EC2 インスタンスにポイントできるようにすることです ( を指す CNAME レコード経由) 。これによりcustom-domain.myproduct.com、ユーザーは次のような独自のカスタム URL 経由でアプリにアクセスできるようになります。myproduct.happyclient.com

これを実現するために、次の nginx 構成を使用します (簡潔にするために一部を削除しています)。

http {
    server {
    # This is my default route. References:
    # http://stackoverflow.com/a/15799883/91403
    # http://nginx.org/en/docs/http/request_processing.html

    listen 80 default_server;
    server_name custom-domain.myproduct.com;
    location / {
        proxy_pass http://static.myproduct.com; # points to Amazon S3
        proxy_set_header Host myproduct.com;
    }
}

私の静的アプリは 100% 公開されていますが (クライアント シークレットはなく、HTML と JavaScript のみ)、一部のクライアントは SSL 経由でアクセスしたいと考えています。ホスト ヘッダーに基づいて、SSL 接続に使用する証明書を動的に選択するにはどうすればよいでしょうか。証明書パスを単純にハードコードすることはできないことに注意してください。

追伸.: クライアントは自分の証明書を私のインスタンスにアップロードできるようになります
プレイステーション2.: この設定は HTTP のみで既に完璧に動作します。

私が試したこと

私は次のようなことを試しましたが、成功しませんでした:

server {
    listen 443 default_server;
    server_name custom-domain.myproduct.com;
    ssl on;
    ssl_certificate /etc/nginx/ssl/$http_host/server.crt; # note the http_host variable
    ssl_certificate_key /etc/nginx/ssl/$http_host/server.key; # also here
}

答え1

ホスト ヘッダーに基づいて、SSL 接続に使用する証明書を動的に選択するにはどうすればよいですか?

Host ヘッダーは HTTP プロトコルの一部ですが、HTTPS は SSL 接続に埋め込まれた HTTP です。つまり、Host ヘッダーにアクセスする前に、まず SSL 接続 (証明書が必要) を確立する必要があります。

クライアントが SNI をサポートしている場合 (すべての最新ブラウザはサポートしていますが、IE/XP はサポートしていません)、SSL ハンドシェイク内でターゲット名がすでに送信されます。ターゲット名に基づいて異なる証明書を提供することは、通常、nginx の異なるサーバー セクションで行われます。$ssl_server_nameデフォルト セクション内で を使用することを試みることはできますが、これが機能するかどうかはわかりません。また、機能したとしても、セッション キャッシュなどの最適化に悪影響を与える可能性があります。

関連情報