2013-08-19 23 views
16

SSLプロキシとしてNginxを使用する必要があります。サブドメインに応じてトラフィックをさまざまなバックエンドに転送します。httpsを使用するとホストに基づくnginxプロキシ

私は複数の "server {"セクションを定義する必要がありますが、SSLでは正しく動作しません。そうすることで、httpsトラフィックを処理するまでは、サーバー名として最初の仮想ホストで常にSSLが処理されることになります。

シナリオ:

  • 1つのIPアドレス
  • 一つSSLワイルドカードワイルドカード次のようにアクセスする必要が
  • 複数のバックエンド:

    https://one.mysite.com/ -> http://localhost:8080 
    https://two.mysite.com/ -> http://localhost:8090 
    

nginxのは、「言います「悪」:http://wiki.nginx.org/IfIsEvilですが、他に何ができますか?

私はこれを試しましたが、動作しません、私は500エラーを取得しますが、エラーログには何もありません。

server { 
    listen 443; 
    server_name *.mysite.com; 

    ssl on; 
    ssl_certificate ssl/mysite.com.crt; 
    ssl_certificate_key ssl/mysite.com.key; 

    location/{ 
     if ($server_name ~ "one.mysite.com") { 
      proxy_pass http://localhost:8080; 
     } 
     if ($server_name ~ "two.mysite.com") { 
      proxy_pass http://localhost:8090; 
     } 
    } 

誰でもNginxでこれを達成できましたか?どんな助け/代替、リンクも、非常に高く評価されるでしょう。

答えて

27

私は「サーバ」ブロック外のSSLオプションとSSL証明書を定義するために、基本的なソリューションが見つかりました:

ssl_certificate ssl/mysite.com.crt; 
ssl_certificate_key ssl/mysite.com.key; 
ssl_session_timeout 5m; 
ssl_protocols  SSLv3 TLSv1; 
ssl_ciphers   ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+EXP; 
ssl_prefer_server_ciphers on; 

server { 
    listen 80; 
    server_name *.mysite.com; 
    rewrite^https://$host$request_uri? permanent; 
} 
server { 
    listen 443 ssl; 
    server_name one.mysite.com; 

    ssl on; 

    location/{ 
     proxy_pass http://localhost:8080; 
    } 
} 
server { 
    listen 443 ssl; 
    server_name two.mysite.com; 

    ssl on; 

    location/{ 
     proxy_pass http://localhost:8090; 
    } 
} 

主なもの:

  • 「でSSLを。」 httpsでリッスンする "サーバー"ブロック内にある必要があるのは唯一のものですが、外部に置くこともできますが、ポート80でHTTPSプロトコルを使用するようにリッスンする "server"ブロックを作成します。
  • "ssl_certificate"と "ssl_ciphers:"と他の "ssl_ *"は "server"ブロックの外にあるので、Nginxはserver_nameなしでSSLオフロードを行います。これはSSL復号化が任意のホスト名、この段階ではURLが暗号化されているよう
  • JAVA、今仕事に失敗しないカールなしSERVER_NAMEはありません - 。。。ホストミスマッチが
+7

ありがとう、この情報は私にとって非常に役に立ちました。 FYI: 'listen 443 ssl;を使用すると、SSLモードを有効にするため、' ssl on; 'を実行する必要もないことが分かりました。出典:http://nginx.org/en/docs/http/ngx_http_core_module.html#listen – Tom

1

http://www.informit.com/articles/article.aspx?p=1994795によれば、実際には2つの異なるサーバー名を持つ2つの「サーバー」セクションが必要です。 それぞれに、ssl_ *ディレクティブを含める必要があります。

+0

これには1つの問題があります。例を挙げて説明しましょう:2つの「サーバー」がある場合は、ポート443でリッスンするSSLを持つセクションNginxは最初のバーチャルホストを使用してSSL decriptionを行います。なぜなら、あなたはまだどのドメインを持っているのか分からないからです。ドメインが一致すると、正しい仮想ホストのディレクティブが実行されますが、間違った仮想ホストでSSLデシジョンが実行されます。ホスト名と実際に使用されたドメインとの不一致があるため、JAVAとcurl(おそらくより多くのSSLクライアント)が失敗します。 –

+1

これはSNIが修正するものです。現代的なブラウザーのほとんどがこれをサポートしているので、人生を大幅に単純化します。 – rubyruy